我有一个硬性要求,即我的一个类
ClassX
由第三方模块 Modul3P
以反射方式实例化,调用 ClassX
的默认构造函数。然后,Modul3P
调用实例的方法之一,aMethod()
:
//inaccessible, approximate code
void Modul3P(String className) {
Class<?> clazz = Class.forName(className);
InterfaceX object = (InterfaceX) clazz.newInstance();
object.aMethod();
}
interface InterfaceX {
void aMethod();
}
我的
ClassX
,然而,严重依赖于正确设置的参数:
class ClassX implements InterfaceX {
ClassX(Object param){...} //required for proper setup
ClassX(){...}; //called by Modul3P
void aMethod(){...}
}
如何克服这个问题?
我失败的尝试(使用Javassist)是创建一个正确的实例
inst
,然后动态创建一个派生自ClassX
的类,该类可以默认初始化,并且在初始化期间将被注入inst
:
class ClassX implements InterfaceX {
//...
Class<? extends ClassX> defaultConstructibleOnTheFlyClass(){...}
}
//...
ClassX inst = new ClassX(aParam); //proper initialisation
Modul3P(inst.defaultConstructibleOnTheFlyClass().getName());
也许你应该使用
Factory
模式。这比使用反射更容易维护和扩展:
public interface Builder<T> {
T createObject(String param);
}
public class MyFactory {
Map m = new HashMap<String, Builder>();
public void addBuilder(String str, Builder b) {
... // add the str / builder pair to the map
}
public Object create (String builderName, String param) {
Builder b = m.get(builderName);
if (b == null) throw ...
return b.createObject(param);
}
}