Java如何通过反射获取非静态内部类
这篇“Java如何通过反射获取非静态内部类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何通过反射获取非静态内部类”文章吧。
一、无参构造函数
public class OuterClass { public void process() { System.out.println("外部类方法..."); } class InnerClass { public void process() { System.out.println("内部类方法..."); } }}
【1】获取内部类对象需要依赖外部类的对象
【2】通过Class获取内部类可以通过俩种方式
第一种:Class.forName("package.name.OuterClass I n n e r C l a s s " ) 通 过 InnerClass") 通过 InnerClass")通过符号定位到内部类
第二种:通过外部类Class使用OuterClass.class.getDeclaredClasses()获取外部类下可用的内部类对象
【3】实例化类需要构造器,反射调用构造器需要设置可访问constructor.setAccessible(true);
@Test public void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { //需要依赖外部类对象实例化内部类 Class outerClass = Class.forName("reflection.demo.OuterClass"); Object outerObject = outerClass.newInstance(); //如果知道外部类下内部类数量,那么通过下面方式即可 Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0]; //如果知道内部类全限定名,可以通过下面的方式 //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass") //获取默认构造器 Constructor<?> constructor = innerClass.getDeclaredConstructors()[0]; //也可以通过下面的方式获取构造器 //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class); //默认构造器私有的,需要设置可访问 constructor.setAccessible(true); //通过构造器和父类Class创建内部类实例 Object innerObject = constructor.newInstance(outerObject); Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process"); innerClassDeclaredMethod.setAccessible(true); innerClassDeclaredMethod.invoke(innerObject); }
二、有参构造函数
上面描述的是不带参数的构造函数,下面描述下带参数的构造函数
public class OuterClass { private String name; public OuterClass(String name) { this.name = name; } public void process() { System.out.println("外部类方法..."); } class InnerClass { private String name; public InnerClass(String name) { this.name = name; } public void process() { System.out.println(name+"----内部类方法..."); } }}
@Test public void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { //需要依赖外部类对象实例化内部类 Class outerClass = Class.forName("reflection.demo.OuterClass"); Constructor declaredConstructor = outerClass.getDeclaredConstructor(String.class); declaredConstructor.setAccessible(true); //获取外部类实例以及设置构造函数值 Object outerObject = declaredConstructor.newInstance("outerClass"); //如果知道外部类下内部类数量,那么通过下面方式即可 Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0]; //如果知道内部类全限定名,可以通过下面的方式 //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass") //获取默认构造器 Constructor<?> constructor = innerClass.getDeclaredConstructors()[0]; //也可以通过下面的方式获取构造器 //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class); //默认构造器私有的,需要设置可访问 constructor.setAccessible(true); //通过构造器和父类Class创建内部类实例.设置构造函数值 Object innerObject = constructor.newInstance(outerObject,"innerClass"); Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process"); innerClassDeclaredMethod.setAccessible(true); innerClassDeclaredMethod.invoke(innerObject); }
以上就是关于“Java如何通过反射获取非静态内部类”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341