繁体   English   中英

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

[英]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。 但是,您将丢失任何带ControllerBaseController注释的类型的实例,稍后将对其进行修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM