方法调用方法invoke时出现问题- 'V put(K key, V val)' 从代理 Map 返回 null。 但是对于方法 - V get(K key) 就可以了。
查看代码示例
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
}
}
最佳答案
引用the documentaion , Map#put
返回“与键关联的前一个值,如果键没有映射则返回 null”。由于这是第一次向 map 引入键0
,所以put(0, "value-0")
的返回值确实是null
。如果 map 未被代理,您将获得相同的结果。
关于java - 为什么方法调用 return null for method put from proxied Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56191915/