Google Guice绑定问题

时间:2014-07-01 21:59:10

标签: java reflection

我正在使用Google Guice IoC容器。我有两个包,一个包含接口,另一个包含这些接口的实现。

ClassFinder类返回包中的类列表。

当我尝试绑定接口到实现时,我收到以下编译错误:无法从方法解析<java.lang.Class<capture<?>>方法。< / p>

API指定可以作为参数Class,packageClass是Class。应该是什么问题?

public void autoMatch(String basePackageName)
    {
        String interfacesPackage = basePackageName + "." + interfacesPackageName;
        String implementationPackage = basePackageName + "." + implementationPackageName;

        List<Class<?>> interfaces = ClassFinder.find(interfacesPackage);
        List<Class<?>> implementations = ClassFinder.find(implementationPackage);
        for(Class<?> packageClass : implementations)
        {
            String name = packageClass.getSimpleName();
            try
            {
               Class<?> foundInterface
                         = interfaces.stream()
                          .filter(packageInterface -> packageInterface.getSimpleName().equals(name + "Interface"))
                          .findFirst().get();
                bind(foundInterface).to(packageClass);
            }
            catch (NoSuchElementException exception)
            {
                Log.error("IoC", "Could not match interface to implementation", exception);
            }
        }
    }

修改

通过强制转换为(Class)来解决问题。找到该类,但绑定时会抛出java.lang.NullPointerException。

2 个答案:

答案 0 :(得分:1)

通过不再使用ClassFinder查找类并使用Reflections库来修复此问题。

public void autoMatch(String basePackageName)
{
    String interfacesPackage = basePackageName + "." + interfacesPackageName;
    String implementationPackage = basePackageName + "." + implementationPackageName;

    Reflections interfacesReflections = new Reflections(interfacesPackage);
    Reflections implementationsReflections = new Reflections(implementationPackage);

    Set<Class<? extends Object>> interfaces = interfacesReflections.getSubTypesOf(Object.class);
    Set<Class<? extends Object>> implementations = implementationsReflections.getSubTypesOf(Object.class);

    for(Class<?> packageClass : implementations)
    {
        String name = packageClass.getSimpleName();
        try
        {
            Class<?> foundInterface
                    = interfaces.stream()
                      .filter(packageInterface -> packageInterface.getSimpleName().equals(name + "Interface"))
                      .findFirst().get();
            bind(foundInterface).to((Class)packageClass);
        }
        catch (NoSuchElementException exception)
        {
            Log.error("IoC", "Could not match interface to implementation", exception);
        }
    }
}

答案 1 :(得分:1)

问题是你在编译时失去信息该类实现了接口。从编译器的角度来看,最终会得到两个不相关的Class<?>对象,而Guice是用泛型编写的,没有方法可以将它们相互绑定。

未经测试:请考虑使用Class代替Class<?>,因此不使用泛型。

那就是说,我建议你手工编写20-30个绑定。使用依赖注入的想法是将接口与其实现分离,并且您的方法将在它们之间引入一个微妙的,难以调试的运行时依赖性,我认为这不是一件好事。