[英]Java Reflection How to instantiate class field type
我有以下尝试通过反射实例化的跟随类,然后自动将其实例化为字段“ 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)
这是您遇到的问题:
field.set(autowiredObject.getClass(), autowiredObject);
查看有关Field.set(Object, Object)
方法参数的文档 。 我引用了一部分:
参数:
obj-应该修改其字段的对象
value-要修改的obj字段的新值
(如果该字段是静态的,则应将obj改为null
)。
这意味着您实际上应该将与clazz
类型相同的目标实例作为Field.set(Object, Object)
方法中的第一个参数,因为您尝试修改该字段的目标实例不是的Class
对象。 DatabaseService。 但是,您将丢失任何带Controller
或BaseController
注释的类型的实例,稍后将对其进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.