反射的应用
框架中的应用
flowchart TD
框架应用[框架应用]
框架应用 --> SpringIOC[Spring IOC]
框架应用 --> MyBatisMapper[MyBatis Mapper]
框架应用 --> JUnit测试
框架应用 --> 序列化框架
注解处理示例
// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {
String value() default "";
}
// 注解处理器
public class LogProcessor {
public static void process(Object obj) {
Class<?> clazz = obj.getClass();
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(Log.class)) {
Log log = method.getAnnotation(Log.class);
System.out.println("执行方法: " + method.getName() +
", 日志: " + log.value());
}
}
}
}
动态类加载
// 自定义类加载器
class DynamicClassLoader extends ClassLoader {
public Class<?> loadClass(byte[] classBytes) {
return defineClass(null, classBytes, 0, classBytes.length);
}
}
// 动态加载类
byte[] bytes = Files.readAllBytes(Paths.get("Demo.class"));
Class<?> clazz = new DynamicClassLoader().loadClass(bytes);
Object instance = clazz.newInstance();
实际案例
- Spring依赖注入:通过反射创建Bean并注入依赖
- MyBatis Mapper:接口方法动态实现
- JUnit测试:发现并执行测试方法
- Jackson序列化:通过反射获取对象属性
注意事项
- 性能敏感场景慎用
- 注意安全检查(setAccessible)
- 处理好受检异常
- 避免破坏封装性
- 考虑安全性问题