Outer.javapackage ref;
public class Outer
{
public Outer()
{
System.out.println("Outer()");
}
public class Inner
{
public Inner()
{
System.out.println("Inner()");
}
public void innerM()
{
System.out.println("Inner's m()");
}
public String toString()
{
return "Inner's toString()";
}
}
}
复制代码测试类package ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class TestInnerRef
{
public static void main(String[] args) throws Exception
{
// method1();
method2();
}
/*
* 利用类名Outer$Inner得到内部类的类对象
* 直接newInstance会抛出java.lang.InstantiationException: ref.Outer$Inner
* 构造成员内部类对象需要外部类对象,所以这样使用有问题
*/
public static void method1() throws Exception
{
Class c = Class.forName("ref.Outer$Inner");
System.out.println(c.getName());
Object o = c.newInstance();
}
public static void method2() throws Exception
{
Class outc = Class.forName("ref.Outer");
Object outer = outc.newInstance();
Class[] incs = outc.getClasses();
for (Class inc : incs)
{
System.out.println(inc.getName());
Constructor con = inc.getConstructor(new Class[]{outc});
Object inner = con.newInstance(outer);
System.out.println(inner);
Method m = inc.getMethod("innerM", new Class[]{});
m.invoke(inner, new Object[]{});
}
}
}