如何实例化具有带有参数的私有构造函数的泛型类

时间:2019-09-03 11:51:31

标签: java reflection

我正在使用3rd-party库创建Java应用程序,并希望实例化其类。但是,该类是泛型的,并且只有一个私有构造函数。

我尝试通过Guice注入创建实例。 Test<T>无法修改,因此我既未使用@Inject进行注释,也未添加非私有的零参数构造函数。

public class Test<T> {
    private final T value;

    private Test(T value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value.toString();
    }
}
Injector injector = Guice.createInjector(new AbstractModule() {
    @Override
    protected void configure() {
        bind(new TypeLiteral<Test<String>>() {
        });
    }
});
Test<String> test = (Test<String>) injector.getInstance(Test.class);
System.out.println(String.format("%s", test));
1) Could not find a suitable constructor in com.example.app.Test. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.

我想知道如何向Test类的构造函数添加参数,以及如何实例化它。

1 个答案:

答案 0 :(得分:0)

您可以(但可能不应该)使用反射来做到这一点:

    Constructor<Test> declaredConstructor = Test.class.getDeclaredConstructor(Object.class);
    declaredConstructor.setAccessible(true); // or if (declaredConstructor.trySetAccessible()) on java 9+
    Test<String> obj = declaredConstructor.newInstance("value of first parameter");

泛型在运行时被忽略,因此您只需要在Object.class处使用下限。如果它是class Test<T extends Something>,那么您会寻找Something.class,但默认情况下它是Object。

如果该测试类来自某个库,则可能有创建它的方法...因此您可以避免使用反射。