在受包受保护的类的ctor上调用newInstance

时间:2013-11-08 18:34:21

标签: java reflection default-constructor

我有一个受包受保护的(默认)类

package a;    
class Foo {}

所以隐含地,它将拥有一个受包受保护的构造函数。

现在,如果我有Constructor<Foo> fooCtor = ...;

的引用

如果我尝试在fooCtor.newInstance()之外调用package a,我是否应该得到某种异常?

1 个答案:

答案 0 :(得分:0)

除非更改构造函数的可访问性,否则无法创建类的实例。如果您的Foo课程如下:

package org.visib.a;
class Foo {
  @Override
  public String toString() {
    return "This is a foo";
  }
}

您可以尝试实例化Foo,但会获得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);