猿问

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

我有一个跟随类,我试图通过反射实例化,然后自动实例化它的字段“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


总体问题:我不确定如何将实例化的类对象(DatabaseService)设置回它的父类(BaseController)


RISEBY
浏览 150回答 1
1回答

蛊毒传说

这是你的问题所在:field.set(autowiredObject.getClass(),&nbsp;autowiredObject);查看方法参数的文档Field.set(Object, Object)。我引用了一部分:参数:obj - 应修改其字段的对象value - 正在修改的 obj 字段的新值(如果该字段是静态的,则应使用 objnull代替)。这意味着您实际上应该将目标实例与方法中clazz的第一个参数的类型相同Field.set(Object, Object),因为您尝试修改字段的目标实例不是ClassDatabaseService的对象。但是,您缺少一个用Controller, 或注释的任何类型的实例BaseController,正如您稍后修改的那样。
随时随地看视频慕课网APP

相关分类

Java
我要回答