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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

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

假设我有以下类:

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

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

我将如何构建一个new Foo("hello")使用反射?

以下工作:

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);
    }   
}
提问于
用户回答回答于

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

用户回答回答于

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

像这样的东西应该工作。

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);

扫码关注云+社区