我找到了更好的解决方案
使用CDI.current()对象:class TestClass {
@Inject
ClassnameCollection collection; // Inject
void doSth(classsuffix) throws Exception {
dynamicObject = CDI.current().select(
(Class) Class.forName("org.test.Classname" + suffix)).get();
dynamicObject.doStuff();
}}
一个示例类供参考:public class ClassnameOne implements TestInterface {
@Inject
private Logger log;
// ...
@Override
public void doStuff() {
// Do stuff
log.info("done");
}}
使用此解决方案,不需要对现有类或类似的类进行任何更改。
旧版
我可能找到的最佳解决方案是这样的:
创建所有可用类的集合:public class ClassnameCollection {
@Inject
public ClassnameOne classnameOne;
@Inject
public ClassnameTwo classnameTwo;
// ...}
并将其注入您想要动态类的类中:class TestClass {
@Inject
ClassnameCollection collection; // Inject
void doSth(classsuffix) throws Exception {
Class collectionClass = ClassnameCollection.class;
Field collectionField = collectionClass.getDeclaredField("classname" + suffix); // Get the declared field by String
TestInterface dynamicObject = (TestInterface) collectionField.get(collection);
// There you have the dynamic object with all the subclasses (for example Logger) initialized
dynamicObject.doStuff();
}}
一个示例类供参考:public class ClassnameOne implements TestInterface {
@Inject
private Logger log;
// ...
@Override
public void doStuff() {
// Do stuff
log.info("done");
}}
老实说,我认为这是最好的解决方案,因为它不会改变任何子类,并且维护非常简单(只需Inject在ClassnameCollection类中添加一个新的)。