一、匿名内部类的使用场景匿名内部类是一种没有显式类名、直接在创建对象时定义并实例化的内部类。它通常用于“一次性使用”的场景让代码更简洁紧凑。主要使用场景包括1. 事件监听器GUI 编程在 Swing、AWT 或 Android 开发中需要为按钮、菜单等组件添加事件处理器。匿名内部类可以避免为每个事件单独创建类文件。button.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { System.out.println(按钮被点击); } });2. 多线程Runnable / Thread当需要临时启动一个线程执行任务时匿名内部类比单独定义Runnable实现类更简洁。new Thread(new Runnable() { Override public void run() { System.out.println(线程运行中...); } }).start();3. 比较器Comparator对集合进行排序时Collections.sort()或Arrays.sort()需要传入Comparator接口的实现。匿名内部类常用于快速定义自定义排序逻辑。ListString list Arrays.asList(apple, pear, banana); Collections.sort(list, new ComparatorString() { Override public int compare(String s1, String s2) { return s1.length() - s2.length(); } });4. 回调函数或策略模式当需要一个简单的策略或回调逻辑且该逻辑只在此处使用时匿名内部类可避免定义多余的命名类。public interface Callback { void onSuccess(String result); } public void doAsync(Callback callback) { ... } // 调用时 doAsync(new Callback() { Override public void onSuccess(String result) { System.out.println(result); } });5. 自定义抽象类/接口的临时实现例如使用TimerTask、FilterServlet等抽象类或接口时若只用一次匿名内部类很方便。Timer timer new Timer(); timer.schedule(new TimerTask() { Override public void run() { System.out.println(定时任务执行); } }, 5000);匿名内部类的限制只能实现一个接口或继承一个抽象类/普通类。内部访问局部变量时该变量必须是final或实际不可变Java 8 后 effectivly final。不能定义静态成员常量除外。没有构造方法。现代替代方案Java 8如果接口只有一个抽象方法函数式接口可以用Lambda 表达式更简洁地替换匿名内部类。例如上面的Runnable、Comparator都可以改为 Lambdanew Thread(() - System.out.println(线程运行...)).start(); Collections.sort(list, (s1, s2) - s1.length() - s2.length());二、java反射机制Java反射机制是指在运行时动态地获取一个类的信息如方法、字段、构造器、注解等并能动态创建对象、调用方法、访问或修改成员包括私有成员的能力。核心功能获取Class对象Class.forName(类全名)、对象.getClass()、类名.class创建实例clazz.newInstance()或构造器的newInstance()访问成员方法getMethod()/getDeclaredMethod()并调用invoke()字段getField()/getDeclaredField()并调用get()/set()可配合setAccessible(true)打破封装构造器getConstructor()/getDeclaredConstructor()获取注解、父类、接口等元数据常见用途框架Spring、MyBatis的依赖注入、对象创建通用工具如JSON解析库根据字段名自动赋值动态代理JDK Proxy 基于接口反射调试或绕过私有成员进行测试注意事项性能比直接调用慢可考虑缓存Method/Field安全setAccessible(true)会破坏封装性可能带来安全风险权限在某些受限环境如安全管理器下可能失败