第一种情况,通过反射来构造公开的静态的内部类的对象。
package com.example.reflect; import java.lang.reflect.InvocationTargetException; public class Outer { /** * 通过反射来构造公开的静态的内部类的对象 * @author jack * */ public static class Inner1{} public static void main(String[] args) throws ClassNotFoundException { System.out.println(Inner1.class); //输出内部类的全名 结果:class com.example.reflect.Outer$Inner1 System.out.println(Class.forName("com.example.reflect.Outer$Inner1")); //输出内部类的全名 结果:class com.example.reflect.Outer$Inner1 System.out.println(Class.forName("com.example.reflect.Outer$Inner1").getConstructors().length); //输入该内部类构造函数的个数 结果:1 System.out.println(Class.forName("com.example.reflect.Outer$Inner1").getConstructors()[0]); //输入缺省的内部类的构造函数 结果:public com.example.reflect.Outer$Inner1() try { System.out.println(Class.forName("com.example.reflect.Outer$Inner1").getConstructors()[0].newInstance()); //输入产生一个内部类实例的地址 结果:com.example.reflect.Outer$Inner1@1e63e3d } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第二种情况,通过反射来构造非公开的静态的内部类对象。
package com.example.reflect; import java.lang.reflect.InvocationTargetException; public class Outer2 { /** * 通过反射来构造非公开的静态的内部类对象 * @author jack * */ static class Inner2{} public static void main(String[] args) throws SecurityException, ClassNotFoundException { System.out.println(Class.forName("com.example.reflect.Outer2$Inner2").getConstructors().length); //输出获取内部类对象的个数 结果:0 //但真的是0吗? System.out.println(Class.forName("com.example.reflect.Outer2$Inner2").getDeclaredConstructors().length); //使用另一种方法来输出获取内部类对象的个数 结果:1 //其实内部类的访问权限是default 非公开的 通过getConstructors()获取不到构造函数,而通过getDeclaredConstructors()却能获取到构造函数 //所以可以通过getDeclaredConstructors()获取构造函数反射构造非公开的内部类对象,如下: try { System.out.println(Class.forName("com.example.reflect.Outer2$Inner2").getDeclaredConstructors()[0].newInstance()); //输出内部类对象的地址 结果:com.example.reflect.Outer2$Inner2@1e63e3d 通过反射来构造非公开的静态的内部类对象成功 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
第三种情况,通过反射来构造非公开的内部类对象。
package com.example.reflect; import java.lang.reflect.InvocationTargetException; public class Outer3 { /** * 通过反射来构造非公开的内部类对象 * @author jack * */ class Inner3{} public static void main(String[] args) throws SecurityException, ClassNotFoundException { System.out.println(Class.forName("com.example.reflect.Outer3$Inner3").getDeclaredConstructors().length); // 对于默认的访问权限来说,必须通过getDeclaredConstructors()开获取构造函数,所以结果:1 try { //System.out.println(Class.forName("com.example.reflect.Outer3$Inner3").getDeclaredConstructors()[0].newInstance()); //直接使用getDeclaredConstructors()[0].newInstance()报错 //错误——java.lang.IllegalArgumentException: wrong number of arguments1,说明缺少参数 System.out.println(Class.forName("com.example.reflect.Outer3$Inner3").getDeclaredConstructors()[0]); //输出内部类的构造函数,结果:com.example.reflect.Outer3$Inner3(com.example.reflect.Outer3) //原来构造方法里需要一个Outer3类型的参数,所以通过反射来构造非公开的内部来对象如下: System.out.println(Class.forName("com.example.reflect.Outer3$Inner3").getDeclaredConstructors()[0].newInstance(new Outer3())); //输出内部类对象的地址 结果:com.example.reflect.Outer3$Inner3@1e63e3d 反射构造非公开的内部类对象成功 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }