【发布时间】:2018-08-05 22:17:28
【问题描述】:
我有一个跟随类,我试图通过反射实例化,然后自动实例化它的字段'databaseService'
@Controller
public class BaseController {
@AutoInstantiate
private DatabaseService databaseService;
@AfterSetup
public void initialize() {
System.out.println("Testing " + databaseService.getEntry());
}
}
我正在尝试自动实例化的简单类
public class DatabaseService {
public DatabaseService() {}
public String getEntry() {
return "I'm working! ";
}
}
我想做什么
public class Instantiator {
private static void start() {
Reflections reflections = new Reflections("com");
Class<?> clazz = reflections.getTypesAnnotatedWith(Controller.class)[0];
//Assume 'clazz' is 'BaseController' (the parent class of DatabaseService)
for(Field field : clazz.getDeclaredFields()) {
if(field.isAnnotationPresent(AutoInstantiate.class)) {
try {
field.setAccessible(true);
Object autowiredObject = field.getType().newInstance();
//HERES WHERE IT ALWAYS FAILS
field.set(clazz, autowiredObject);
}
catch(Exception e) {
logger.severe("Failure invoking class " + clazz.getName() + " Problem : " + e.getMessage());
}
}
}
}
}
还有简单的主要
public class App {
public static void main(String[] args) throws Exception {
Instantiator.start();
}
}
问题 严重:调用类 com.controller.BaseController 失败问题:无法将 com.service.DatabaseService 字段 com.controller.BaseController.databaseService 设置为 java.lang.Class
总体问题: 我不确定如何让实例化类 Object (DatabaseService) 设置回它的父类 (BaseController)
【问题讨论】:
-
您需要为该 set 方法提供对象实例,而不是字段类型。
-
@GotoFinal 感谢您的回复。我尝试了几种方法,但仍然无法使其正常工作。你能简单地告诉我那会是什么样子吗?非常感谢
-
看看 IoC 容器是如何工作的。
-
除非有
BaseController对象,否则无法实例化对象字段。 -
@zhh 为了读者的方便,我删除了一些代码行。我更新了上面的代码。假设这里的“clazz”是 BaseController
标签: java reflection