为了账号安全,请及时绑定邮箱和手机立即绑定

Java Reflection 如何实例化类字段类型

Java Reflection 如何实例化类字段类型

RISEBY 2021-06-23 17:10:04
我有一个跟随类,我试图通过反射实例化,然后自动实例化它的字段“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),因为您尝试修改字段的目标实例不是ClassDatabaseService的对象。但是,您缺少一个用Controller, 或注释的任何类型的实例BaseController,正如您稍后修改的那样。


查看完整回答
反对 回复 2021-06-30
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信