为方法调用方法调用时存在问题- 代理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
}
}
答案 0 :(得分:2)
要引用the documentaion,Map#put
重新运行“与键关联的先前值,如果没有键的映射,则为null”。由于这是您首次将密钥0
引入地图,因此put(0, "value-0")
的返回值确实为null
。如果不使用地图,您将获得相同的结果。
答案 1 :(得分:1)
这是预期的-put返回地图上的前一个值;如果不存在,则返回null
参见javadoc:
返回值:
与key关联的先前值;如果没有key映射,则为null。