我有一个包保护(默认)类
package a;
class Foo {}
所以隐含地,它将有一个包保护的构造函数。
现在,如果我有参考Constructor<Foo> fooCtor = ...
;
fooCtor.newInstance()
如果我尝试在外部调用,我不应该得到某种异常package a
吗?
我有一个包保护(默认)类
package a;
class Foo {}
所以隐含地,它将有一个包保护的构造函数。
现在,如果我有参考Constructor<Foo> fooCtor = ...
;
fooCtor.newInstance()
如果我尝试在外部调用,我不应该得到某种异常package a
吗?
除非更改构造函数的可访问性,否则无法创建类的实例。如果你的Foo
班级如下:
package org.visib.a;
class Foo {
@Override
public String toString() {
return "This is a foo";
}
}
您可以尝试实例化 aFoo
但会得到一个IllegalAccessException
,例如,尝试:
package org.visib.b;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class FooCreator {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> clazz = Class.forName("org.visib.a.Foo");
for (Constructor<?> c : clazz.getDeclaredConstructors()) {
System.out.println("Found constructor: " + c);
Object foo = c.newInstance();
System.out.println(foo);
}
}
}
但是,您可以更改构造函数的访问修饰符。只需在 for 循环中添加以下行:
c.setAccessible(true);