【问题标题】:Create a proxy class with a no-arg constructor使用无参数构造函数创建代理类
【发布时间】:2011-09-08 07:34:29
【问题描述】:

使用java.lang.reflect.Proxy,我可以创建一个将InvocationHandler 作为构造函数参数的类。但是,该类将通过框架中某处的newInstance() 实例化,并且所有实例的InvocationHandler 可以是相同的。

我可以向代理类添加一个无参数构造函数,它将我的InvocationHandler 传递给原始构造函数吗?

【问题讨论】:

    标签: java reflection proxy


    【解决方案1】:

    恐怕它不会起作用,因为实际的代理魔法发生在这个本机代码中

    private static native Class defineClass0(ClassLoader loader, String name,
                         byte[] b, int off, int len);
    

    只能通过静态方法Proxy.newProxyInstance(ClassLoader, Class<?>[], InvocationHandler) 访问。该方法依次以提供的InvocationHandler 作为参数调用由此生成的类的构造函数。

    因此,您无法从newInstance() 调用中返回代理。最接近的方法是用newInstance() 实例化InvocationHandler 并将其传递给静态工厂方法。

    或者你可以更进一步,拥有一个实现目标接口的类,通过工厂方法构造一个代理字段并将所有接口方法委托给代理。但这将是一个代理周围的代理,我真的不明白这一点。

    【讨论】:

    • 有什么方法可以检查 defineClass0 的原生代码吗?
    • @RawAliasCoder 该代码将是 JRE 和平台特定的,因此您需要一个非常好的理由来考虑更改它 - 而不是我会选择的路线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2012-04-20
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多