我有一个跟随类,我试图通过反射实例化,然后自动实例化它的字段“databaseService”@Controllerpublic 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总体问题:我不确定如何将实例化的类对象(DatabaseService)设置回它的父类(BaseController)
1 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
这是你的问题所在:
field.set(autowiredObject.getClass(), autowiredObject);
查看方法参数的文档Field.set(Object, Object)
。我引用了一部分:
参数:
obj - 应修改其字段的对象
value - 正在修改的 obj 字段的新值
(如果该字段是静态的,则应使用 objnull
代替)。
这意味着您实际上应该将目标实例与方法中clazz
的第一个参数的类型相同Field.set(Object, Object)
,因为您尝试修改字段的目标实例不是Class
DatabaseService的对象。但是,您缺少一个用Controller
, 或注释的任何类型的实例BaseController
,正如您稍后修改的那样。
添加回答
举报
0/150
提交
取消