我希望能够在对象运行初始化程序之前在运行时实现一个方法。这将允许我设置初始化期间使用的字段。
以下是一个例子:
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<A> aClass = (Class<A>)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方式。
答案 0 :(得分:1)
你的意思是这样的假设它会编译(它没有):
@Override
A a = aClass.newInstance()
{
public void initialize() {
this.message = args[1];
}
};
答案 1 :(得分:1)
听起来你想要的是Dynamic Proxies,它自Java 1.3以来就已经可用。
编辑:我查看了mockito以了解他们是如何设法模拟具体类的,结果发现他们创建了字节代码,然后使用类加载器加载它。这不仅没有真正得到你想要的东西,而且比它更复杂。
我同意Stephen C:你为什么要这样做?我怀疑可能有一种更简单的方法。我怀疑可能更适合你的是Strategy或Command模式。在这种情况下,自定义代码在它自己的小类中:
public class Initializer<A> {
public (abstract) void initialize(A parent);
}
final String args[] = ...;
Initializer<A> initializer = new Initializer<A>() {
public void initialize(A parent) {
parent.setMessage(args);
}
};
分配给主类或包装主类(根据需要)。
答案 2 :(得分:1)
您要做的是创建一个新的匿名内部类,它是您在运行时只知道的某个类的子类。反思无法解决这个问题。
动态代理可能......如果您尝试实现动态加载的接口。
我能想到的唯一其他方法是使用BCEL或动态源代码生成/编译。两者都会变得非常复杂。并且都不算纯Java。
我的建议是重新审视你想要实现的目标。 (你的问题没有暗示可能是什么,因此很难提供任何实际的建议。)