Java:使用类型参数访问私有构造函数

2022-08-31 12:02:38

这是关于java私有构造函数的问题的后续。

假设我有以下类:

class Foo<T>
{
    private T arg;
    private Foo(T t) {
        // private!
        this.arg = t;
    }   

    @Override
    public String toString() {
        return "My argument is: " + arg;
    }   
}

如何构造 using 反射?new Foo("hello")

根据jtahlborn的回答,以下工作:

public class Example {
    public static void main(final String[] args) throws Exception {
        Constructor<Foo> constructor;
        constructor = Foo.class.getDeclaredConstructor(Object.class);
        constructor.setAccessible(true);
        Foo<String> foo = constructor.newInstance("arg1");
        System.out.println(foo);
    }   
}

答案 1

确保在获取构造函数时使用,并将其可访问性设置为 true,因为它的私有。getDeclaredConstructors

像这样的东西应该有效。

Constructor<Foo> constructor= (Constructor<Foo>) Foo.class.getDeclaredConstructors()[0];
constructor.setAccessible(true); 
Foo obj = constructor.newInstance("foo"); 
System.out.println(obj);

更新

如果要使用 getDeclaredConstructor,请将 Object.class 作为转换为泛型 T 的参数传递。

Class fooClazz = Class.forName("path.to.package.Foo");
Constructor<Foo> constructor = fooClazz.getDeclaredConstructor(Object.class);
constructor.setAccessible(true); 
Foo obj = constructor.newInstance("foo"); 
System.out.println(obj);

答案 2

您需要获取该类,找到采用下限为 T 的单个参数(在本例中为 Object)的构造函数,强制构造函数可访问(使用该方法),最后使用所需的参数调用它。setAccessible