为什么方法调用从代理Map放置的方法返回null

时间:2019-05-17 18:38:28

标签: java dynamic-proxy

为方法调用方法调用时存在问题-  代理Map的“ V put(K键,V val)”返回null。 但是对于方法-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 个答案:

答案 0 :(得分:2)

要引用the documentaionMap#put重新运行“与键关联的先前值,如果没有键的映射,则为null”。由于这是您首次将密钥0引入地图,因此put(0, "value-0")的返回值确实为null。如果不使用地图,您将获得相同的结果。

答案 1 :(得分:1)

这是预期的-put返回地图上的前一个值;如果不存在,则返回null

参见javadoc
返回值: 与key关联的先前值;如果没有key映射,则为null。