gpt4 book ai didi

java - 如何使用反射通过接口(interface)创建实例?

转载 作者:行者123 更新时间:2023-12-04 08:50:21 30 4
gpt4 key购买 nike

我正在尝试对 Spring 的 DI 进行编码,这只是一个简单的示例。有一个controller,这个@AutoWired是我定义的一个Empty Annotation。

public class UserController {
@AutoWired
private UserServise userServise;// a empty interface
}

这是实现注解注入(inject)的代码:

UserController userController = new UserController();
Class<? extends UserController> clazz = userController.getClass();

Stream.of(clazz.getDeclaredFields()).forEach(field -> {
AutoWired annotation = field.getAnnotation(AutoWired.class);
if (annotation != null) {
field.setAccessible(true);
Class<?> type = field.getType();
try {
Object o = type.getDeclaredConstructor().newInstance();
field.set(userController, o);
} catch (Exception e) {
e.printStackTrace();
}
}
});

当程序运行到

Object o = type.getDeclaredConstructor().newInstance();

抛出

java.lang.NoSuchMethodException: com.learning.servise.UserServise.<init>()

我猜程序找不到接口(interface)的构造函数,那么如何为注入(inject)创建这个实例?

最佳答案

我不完全确定您要实现的目标。我假设 UserService 是一个接口(interface)?如果是这样,则无法实例化。您必须是实现该接口(interface)的类。所以要么写一个类(也可以是匿名的或lambda)要么使用代理:

Object instance = Proxy.newProxyInstance(type.getClassLoader(),
new Class<?>[]{type}, new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//implement your methods here
//determine which method you're in by checking the method arg
}
});

不知道这是否是您想要的,但这是我最好的猜测。

但也许您做错了。当您尝试复制 Spring 时,重要的是您有一个可以 Autowiring 的组件或 bean。所以你应该首先关注你的@Bean 注释(或类似的)。您需要某种注册表来获取带注释的 bean,然后将它们注入(inject)到您的 Autowired 字段中。看来你有这个从后到前的。您应该首先专注于将 bean 注册到您的框架中,只有当您完成注册后才应该尝试注入(inject)它们。

关于java - 如何使用反射通过接口(interface)创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64134250/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com