java - 如何在 Guice 中向 'Class<?> clazz' 注入(inject)一个类?

标签 java dependency-injection guice

我有一个带有构造函数的类,例如:

@Inject
public ClassTest(ITestInterface testInterface, Class<?> clazz){
    ...
}  

问题是如何将类绑定(bind)到可以注入(inject)到此构造函数中的实现,并且 ClassTest 绑定(bind)会选择正确的类吗?

我想在不同的时间点注入(inject)不同的类。当我尝试解决这个问题时,Guice 给出了一个错误,它无法在 java.lang.Class 上找到任何合适的构造函数。

最佳答案

我认为你必须使用 assisted inject Guice 的扩展。

基本上,您按原样定义 ClassTest,但将“变化的”依赖项标记为 @Assisted:

@Inject
public ClassTest(ITestInterface testInterface, @Assisted Class<?> clazz){
    ...
}  

然后,您为 ClassTest 对象创建一个工厂接口(interface),它将接受 Class 参数并返回 ClassTest:

public interface ClassTestFactory {
    ClassTest create(Class<?> clazz);
}

然后您安装特殊类型的模块,它将为您创建工厂:

// Inside your module
install(new FactoryModuleBuilder().build(ClassTestFactory.class));

然后,无论您需要 ClassTest 实例,您都应该注入(inject) ClassTestFactory 接口(interface):

@Inject
YourLogicClass(ClassTestFactory ctFactory) {
    this.ctFactory = ctFactory;
}

最后,您使用它为您想要的每个类对象创建 ClassTest:

ClassTest ct1 = ctFactory.create(SomeClass.class);
ClassTest ct2 = ctFactory.create(AnotherClass.class);

但如果我是你,我真的会重新考虑整个类架构以避免此类事情的需要。

关于java - 如何在 Guice 中向 'Class<?> clazz' 注入(inject)一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435871/

相关文章:

java - 如何在不使用 JGit 下载到本地系统的情况下获取所有提交?

java - 如何在 Spring 中使用 @ComponentScan 懒惰地加载所有 bean?

java - 如何从 Java 应用程序调用窗口安装程序

java - 如果无法解析 import 语句会怎样?

带接口(interface)的 Angular 6 服务

dependency-injection - 如何使用 PARAMETER 构造函数注册类型?

java - 带有自定义注释的 Guice 动态注入(inject)

java - 如何使用 Guice 注入(inject)器创建对象?

unit-testing - 如何测试 Guice AbstractModule 的实现?

java - Twitter4j - 转换为 JSON 的状态仅返回空值