java - 为什么方法调用 return null for method put from proxied Map

标签 java dynamic-proxy

方法调用方法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/

相关文章:

spring - 在 spring batch 框架中, 'lazy-init=true' 和 'scope=step' 有什么区别?

entity-framework - 在 Entity Framework [代码优先] 数据库上使用始终加密

java - 如何在 Java 9 中枚举非系统模块

关于为多个枚举构建HashMap的Java问题

java - 将 JDBC 驱动程序从私有(private)安全 Maven 存储库安装到 Wildfly Swarm 中

Java Web 服务 - 解析响应文本的框架

c++ - C++ 中的动态代理类。可能吗?

java - 将 Python 2D ndarray 加载到 Android 以在 TFLite 上进行推理

c# - 生成动态程序集和类型时程序集和类名的最佳实践?

c# - 从具体类生成拦截代理?