实例化内部类

我有一个实用工具方法,当从中删除不相关的逻辑时,简化的方法将如下所示:

public static  List getFooList(Class clazz) { List returnValue = new ArrayList(); for(int i=0; i < 5; i++) { A object = clazz.newInstance(); returnValue.add(object); } return returnValue; } 

问题是,如果clazz是一个内部类,如Foo.Bar.class ,那么即使Bar是公共的, newInstance()方法也不会工作,因为它会抛出一个java.lang.InstantiationException

有没有办法动态实例化内部类?

如果它真的是一个内部类而不是嵌套 (静态)类,那么就有一个隐式构造函数参数,它是对外部类实例的引用。 你不能在那个阶段使用Class.newInstance – 你必须得到适当的构造函数。 这是一个例子:

 import java.lang.reflect.*; class Test { public static void main(String[] args) throws Exception { Class clazz = Outer.Inner.class; Constructor ctor = clazz.getConstructor(Outer.class); Outer outer = new Outer(); Outer.Inner instance = ctor.newInstance(outer); } } class Outer { class Inner { // getConstructor only returns a public constructor. If you need // non-public ones, use getDeclaredConstructors public Inner() {} } } 

更通用的东西:

  public static  T createInstance(final Class clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { T instanceToReturn = null; Class< ? > enclosingClass = clazz.getEnclosingClass(); if (enclosingClass != null) { Object instanceOfEnclosingClass = createInstance(enclosingClass); Constructor ctor = clazz.getConstructor(enclosingClass); if (ctor != null) { instanceToReturn = ctor.newInstance(instanceOfEnclosingClass); } } else { instanceToReturn = clazz.newInstance(); } return instanceToReturn; } 

仅当clazz表示抽象类或接口时,才会抛出此exception。 您确定要传递代表具体类的Class对象吗?

在Jmockit 1.41中,使用:

ConstructorReflection.newInstance