是否可以在使用reflection时创建匿名类?
我希望能够在对象运行初始化程序之前在运行时实现一个方法。 这将允许我设置初始化期间使用的字段。
这是一个例子:
class A { public A() { initialize(); } public void initialize() { } } class B extends A { public String message; { System.out.println(message); } } public class MainClass { public static void main(final String[] args) throws Exception { Class aClass = (Class)Class.forName(args[0]); // what's next in order to something like this even though // I don't know what subclass of A was passed in as an // argument above A a = aClass.newInstance() { public void initialize() { this.message = args[1]; } }; } }
我可能最终会使用方面,但我想知道是否有纯Java方式。
假设它会编译(它没有),你的意思是这样的东西:
@Override A a = aClass.newInstance() { public void initialize() { this.message = args[1]; } };
你要做的就是创建一个新的匿名内部类,它是你在运行时只知道的某个类的子类。 反思无法解决这个问题。
动态代理可能……如果您尝试实现动态加载的接口。
我能想到的唯一其他方法是使用BCEL或动态源代码生成/编译。 两者都会变得非常复杂。 并且都不算纯Java。
我的建议是重新审视你想要实现的目标。 (你的问题没有暗示可能是什么,因此很难提供任何实际的建议。)
这听起来像你想要的是动态代理 ,自Java 1.3以来一直可用。
编辑:我查看了mockito ,看看他们是如何设法模拟具体类的,结果发现他们创建了字节代码,然后用类加载器加载它。 这不仅没有真正得到你想要的东西,而且它比必要的更复杂。
我同意Stephen C:你为什么要这样做? 我怀疑可能有一种更简单的方法。 我怀疑可能更适合你的是策略或命令模式。 在这种情况下,自定义代码在它自己的小类中:
public class Initializer { public (abstract) void initialize(A parent); } final String args[] = ...; Initializer initializer = new Initializer() { public void initialize(A parent) { parent.setMessage(args); } };
它既可以分配给主类,也可以包装主类(取决于需要)。
- 在Windows任务栏上显示JDialog
- struts2修剪从表单中获取的所有字符串
- 我是否需要另一种方法来使用ColorFactory类?
- 如何编写unit testing以确保我的基于日期/时间的代码适用于所有时区和/ DST?
- Saxon 9.2 / Java / XSLT:使用setParameters()设置变换器参数
- 运行Tomcat服务器org.apache.catalina.deploy.WebXml addServlet时出现exception
- 是否存在使用equals方法进行密钥检查的地图?
- 会话范围bean作为Spring MVC Controller的类属性
- 用C ++编写的JNI将文件读取到jbyteArray