这是后续这个关于java私有构造函数的问题 https://stackoverflow.com/questions/2599440/accessing-the-private-constructor.
假设我有以下课程:
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")
使用反射?
ANSWER
基于杰塔尔博恩的回答 https://stackoverflow.com/questions/5629706/java-accessing-private-constructor-with-type-parameters/5629817#5629817,以下作品:
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);
}
}
确保您使用getDeclaredConstructors
当获取构造函数并将其可访问性设置为 true 时,因为它是私有的。
像这样的东西应该有效。
Constructor<Foo> constructor= (Constructor<Foo>) Foo.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Foo obj = constructor.newInstance("foo");
System.out.println(obj);
Update
如果您想使用 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)