Почему вызов метода возвращает значение null для метода, помещенного из прокси-карты - PullRequest
1 голос
/ 17 мая 2019

Существует проблема, когда вызывается метод invoke для метода - 'V put (K key, V val)' из проксируемой карты возвращает нулевое значение.Но для метода - V get (клавиша K) все в порядке.

См. Пример кода

package com.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LogHandler implements InvocationHandler {

    private final Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Start");
        Object o = method.invoke(target, args);
        System.out.println("Finish");
        return o;

    }
}

-----
package com.dynamic.proxy;

import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {

        LogHandler logHandler = new LogHandler(new HashMap<>());
        Map<Integer, String> map = 
        (Map) Proxy.newProxyInstance(logHandler.getClass().getClassLoader(),
                new Class[]{Map.class},
                logHandler);

        System.out.println(map.put(0, "value-0")); //null
        System.out.println(map.get(0));            // value-0
    }
}


Ответы [ 2 ]

2 голосов
/ 17 мая 2019

В кавычках document , Map#put повторяет «предыдущее значение, связанное с ключом, или ноль, если не было сопоставления для ключа». Поскольку вы впервые вводите ключ 0 на карту, возвращаемое значение put(0, "value-0") действительно null. Вы бы получили тот же результат, если бы карта не была проксирована.

1 голос
/ 17 мая 2019

Это ожидается - put возвращает предыдущее значение на карте или null, если оно не существует

см. От javadoc :
Возвращает: предыдущее значение, связанное с ключом, или ноль, если не было сопоставления для ключа.

...