Java googleguice绑定问题

Java googleguice绑定问题,java,reflection,Java,Reflection,我正在使用GoogleGuice IoC容器。我有两个包,一个包含接口,另一个包含这些接口的实现 ClassFinder类返回包中的类列表 当我尝试将接口绑定到实现时,我收到以下编译错误:无法将方法解析为>interfaces=ClassFinder.find(interfacesPackage); 列表界面 =interfaces.stream() .filter(packageInterface->packageInterface.getSimpleName().equals(名称+“接口”

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

ClassFinder类返回包中的类列表

当我尝试将接口绑定到实现时,我收到以下编译错误:无法将方法解析为
>interfaces=ClassFinder.find(interfacesPackage);
列表界面
=interfaces.stream()
.filter(packageInterface->packageInterface.getSimpleName().equals(名称+“接口”))
.findFirst().get();
绑定(foundInterface).to(packageClass);
}
catch(NoSuchElementException异常)
{
日志错误(“IoC”,“接口与实现不匹配”,异常);
}
}
}
编辑


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

通过不再使用ClassFinder查找类和使用反射库修复了该问题

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);
        }
    }
}
public void autoMatch(字符串basePackageName)
{
字符串interfacesPackage=basePackageName+“+”interfacesPackageName;
字符串implementationPackage=basePackageName+“+”implementationPackageName;
反射界面反射=新反射(界面包);
反射实现反射=新反射(实现包);
设置foundInterface
=interfaces.stream()
.filter(packageInterface->packageInterface.getSimpleName().equals(名称+“接口”))
.findFirst().get();
绑定(foundInterface).to((类)packageClass);
}
catch(NoSuchElementException异常)
{
日志错误(“IoC”,“接口与实现不匹配”,异常);
}
}
}

问题是在类实现接口的编译时丢失了信息。从编译器的角度来看,最终会得到两个不相关的
对象,而且由于Guice是用泛型编写的,因此没有方法将它们相互绑定

未经测试:考虑使用<代码>类< /代码>代替<代码>类< /代码>,因此不使用泛型。


也就是说,我建议您手工写出20-30个绑定。依赖注入的思想是将接口与其实现分离,您的方法将引入一种微妙的,很难调试它们之间的运行时依赖关系,我认为这不是一件好事。

为什么要这样做?当我在一个包中有许多类,并且场景是1接口/1实现时,创建绑定是一种简单的方法。如果出现特殊情况,将以不同的方式处理。你会用什么方法@Thorbjørnravandersenh有多少人?在从Guice切换到dagger之后,我不得不重新审视我的习惯。目前它们并不多,但随着我添加新的类,它们可能会在未来增长。比如说20-30接口/实现。
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);
        }
    }
}