2013-05-08 90 views
1

我有一类构造函数,例如:如何在Guice中为'Class <?> clazz'类注入类?

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

的问题是我怎么绑定一个类来实现可在此构造函数中注入将ClassTest结合选择正确的类?

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

回答

0

要随着时间的推移改变注射值,您可以使用Provider bindings。然后它可能看起来像这样:

模块配置:

public class SomeModule extends AbstractModule{ 

    @Override 
    protected void configure() { 
     bind(Class.class).toProvider(SomeProvider.class); 

    } 
} 

提供者(不是很优雅,但可能是一个开始......):

public class SomeProvider implements Provider<Class<?>>{ 

    private static Class<?> myClazz; 

    public static void setClass(Class<?> clazz){ 
     myClazz = clazz; 
    } 

    @Override 
    public Class<?> get() { 
     return myClazz; 
    } 

} 

有些不同类别:

public class SomeClass{ 
    public int itWorks; 

} 
public class SomeOtherClass{ 
    public int itWorksGreat; 

} 

实施例的客户端代码:

public static void main(String[] args){ 
    SomeProvider.setClass(SomeClass.class); 
    Injector injector = Guice.createInjector(new SomeModule()); 
    printFields(injector.getInstance(Class.class)); 
    SomeProvider.setClass(SomeOtherClass.class); 
    printFields(injector.getInstance(Class.class)); 
} 
private static void printFields(Class clazz) { 
    Field[] declaredFields = clazz.getDeclaredFields(); 
    for(Field field : declaredFields){ 
     System.out.println(field.getName()); 
    } 
} 

最后结果:

itWorks 
itWorksGreat 
+1

你应该永远不会写这样的提供者!它无视了DI概念的全部原因,实际上它是Guice试图去除的东西。 – 2013-05-08 11:39:28

+0

好吧......你说得对(但它仍然有可能)。 +1给你的答案,这真的很好,我不知道这样的解决方案。我想我可以利用我遇到的几个问题 – macias 2013-05-08 13:57:02

1

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

基本上,你定义ClassTest,因为它是,但标记“变”依赖关系@Assisted

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

然后创建为ClassTest对象将接受Class参数和返回ClassTest个工厂接口:

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

然后安装特殊的模块这会为您创建工厂:

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

那么无论你需要ClassTest情况下,您应该注入ClassTestFactory接口,而不是:

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

最后你用它来为你想要的每类对象创建ClassTest S:

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

但如果我是你,我真的会重新考虑整个班级架构,以避免这种需求。

相关问题