gpt4 book ai didi

java - 反射创建匿名类

转载 作者:行者123 更新时间:2023-11-30 01:57:56 25 4
gpt4 key购买 nike

我打算使用我的自定义类加载器导入一个库(jar),结果发现需要在其中一个类上设置一个监听器,例如

Class<?> clazz = getInitializerClass();
Object initializer = clazz.newInstance();

// I would like the below listener to be set on this initializer reflectively
// setOnInitListener() is mathod to be called on initializer
setOnInitListener(new OnInitCompleteListener(){
@Override
public void onInit(){
}
}

问题是我没有可用作导入的监听器,我所能得到的只是通过动态类加载动态获得的 OnInitCompleteListener.class

如何实现上述目标?

注意:我愿意不惜一切代价来实现同样的目标,但如果有一个简单的方法,我们将不胜感激。

最佳答案

匿名类是编译时工件。它们甚至有 Java 编译器可以识别它们的名称,尽管程序员无法访问。

但是,有一个解决方法:由于 OnInitCompleteListener 是一个接口(interface),因此您可以生成一个实现您的接口(interface)的动态代理:

InvocationHandler handler = new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("onInit")) {
... // Listener's code goes here
}
}
};
Class<T> onInitCompleteListenerClass = ... // You get this one dynamically
Object listener = Proxy.newProxyInstance(
classLoader,
new Class[] { onInitCompleteListenerClass },
handler);
// Use listener in the reflective call to a method taking OnInitCompleteListener

MyInitationHandler 实现 InvocationHandler界面。它的 invoke 方法可以检测到它正在代替 onInit 被调用,并根据需要执行工作。

关于java - 反射创建匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53746058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com