需要默认的可构造类,但只有参数化构造函数才有意义

问题描述 投票:0回答:1

我有一个硬性要求,即我的一个类

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());
java dependency-injection reflection javassist
1个回答
0
投票

也许你应该使用

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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.