Java反射之调用内部类
1. 反射调用默认访问权限的内部类
package com.blueStarWei.invoke; import java.lang.reflect.Method; import com.blueStarWei.invoke.OuterClass.InnerClass; class OuterClass { public void func(){ System.out.println("Outer Class."); } class InnerClass { private String mName; public InnerClass(String mName) { this.mName = mName; } void getName(){ System.out.println("Name is : "+mName); } } } public class OuterInnerClass { public static void main(String[] args) { try { /*通过反射实例化内部类 * 强大之处在于:当内部类私有化(private class InnerClass)时,也可以调用 * */ Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass"); Class innerClass = Class.forName("com.blueStarWei.invoke.OuterClass$InnerClass"); Method method = innerClass.getDeclaredMethod("getName"); //TODO study it //内部类newInstance的第一个参数必须是外部类实例的引用 method.invoke(innerClass.getDeclaredConstructors()[0].newInstance(outerClass.newInstance(),"Wei"));//Name is : Wei /*常规方法实例化内部类 * 当内部类私有化时,无法通过该方式实例化内部类 * */ OuterClass outerClass1 = new OuterClass(); InnerClass innerClass1 = outerClass1.new InnerClass("David"); innerClass1.getName();//Name is : David } catch (Exception e) { e.printStackTrace(); } } }
2. 反射调用静态内部类
package com.blueStarWei.invoke; import java.lang.reflect.Method; class OuterClass { public void func(){ System.out.println("Outer Class."); } static class InnerClass { private String mName; public InnerClass(String mName) { this.mName = mName; } void getName(){ System.out.println("Name is : "+mName); } } } public class StaticInnerClass { public static void main(String[] args) { try { /*通过反射实例化内部类 */ Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass"); Class innerClass = Class.forName("com.blueStarWei.invoke.OuterClass$InnerClass"); Method method = innerClass.getDeclaredMethod("getName"); //静态内部类没有持有外部类的引用,不需要传递外部类实例对象的引用 method.invoke(innerClass.getDeclaredConstructors()[0].newInstance("Wei"));//Name is : Wei } catch (Exception e) { e.printStackTrace(); } } }
3. 反射调用匿名内部类
package com.blueStarWei.invoke; class OuterClass { public Runnable runnable = new Runnable() { @Override public void run() { System.out.println("This is InnerClass."); } }; } public class AnonymousInnerClass { public static void main(String[] args) { try { Class outerClass = Class.forName("com.blueStarWei.invoke.OuterClass"); //将匿名内部类当作外部类的成员变量 Runnable runnable = (Runnable) outerClass.getDeclaredField("runnable").get(outerClass.newInstance()); runnable.run(); } catch (Exception e) { e.printStackTrace(); } } }
更多内容,请访问:http://www.cnblogs.com/BlueStarWei
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix