Skip to content

反射工具 - ReflectionUtils

概述

ReflectionUtils 是 Spring Framework 提供的反射工具类,位于 org.springframework.util 包下。它封装了 Java 反射 API 的常用操作,提供了缓存机制、异常处理和更便捷的 API,解决了标准 Java 反射操作繁琐、性能差、异常处理复杂等问题。

核心能力矩阵

能力核心类解决的问题使用频率学习优先级
方法操作ReflectionUtils方法查找、调用、批量处理⭐⭐⭐⭐⭐🔴 高
字段操作ReflectionUtils字段查找、读写、批量处理⭐⭐⭐⭐⭐🔴 高
访问控制ReflectionUtils突破 private 限制⭐⭐⭐⭐🟡 中
缓存机制ReflectionUtils性能优化⭐⭐⭐⭐🟡 中

1. 代码结构分析

1.1 核心类结构

1.2 源码模块划分

模块核心方法功能说明
方法查找findMethod(), findMethod(Class, String, Class...)递归查找类及其父类的方法
方法调用invokeMethod(), handleInvocationTargetException()包装反射调用,统一异常处理
批量方法处理doWithMethods(), doWithLocalMethods()批量处理方法,支持过滤
字段查找findField(), findField(Class, String, Class)递归查找类及其父类的字段
字段操作getField(), setField()读取和设置字段值
批量字段处理doWithFields(), doWithLocalFields()批量处理字段,支持过滤
访问控制makeAccessible()设置可访问性,突破 private
异常处理handleReflectionException(), rethrowRuntimeException()统一异常转换
缓存管理clearCache(), isCglibRenamedMethod()方法和字段缓存

1.3 设计特点


2. 主要使用场景

2.1 场景矩阵

场景问题描述Spring 解决方案复杂度
依赖注入需要调用 @Autowired 标注的方法/字段doWithMethods() + 注解过滤
属性复制对象间属性拷贝doWithFields() + 字段匹配
动态代理需要调用目标对象的方法invokeMethod() + 异常包装
注解处理扫描类中的注解元素doWithMethods/Fields() + 过滤
测试工具测试私有方法makeAccessible() + invokeMethod()
JSON 序列化获取对象所有字段值doWithFields() + 递归

2.2 场景详细分析

场景1:依赖注入(@Autowired 处理)

场景描述:Spring 需要找到并调用所有标注了 @Autowired 的方法进行依赖注入。

原生 Java 反射的问题

java
// 1. 需要递归查找父类
// 2. 需要处理受检异常
// 3. 需要过滤特定注解
// 4. 代码量大且重复

Spring 解决方案

java
ReflectionUtils.doWithMethods(targetClass, method -> {
    if (method.isAnnotationPresent(Autowired.class)) {
        ReflectionUtils.makeAccessible(method);
        // 执行注入逻辑
    }
}, ReflectionUtils.USER_DECLARED_METHODS);

场景2:属性复制(BeanUtils.copyProperties)

场景描述:将一个对象的属性值复制到另一个对象。

Spring 解决方案

java
ReflectionUtils.doWithFields(source.getClass(), field -> {
    ReflectionUtils.makeAccessible(field);
    Object value = ReflectionUtils.getField(field, source);
    
    Field targetField = ReflectionUtils.findField(target.getClass(), field.getName());
    if (targetField != null) {
        ReflectionUtils.makeAccessible(targetField);
        ReflectionUtils.setField(targetField, target, value);
    }
});

场景3:动态代理方法调用

场景描述:AOP 代理需要调用目标对象的方法。

Spring 解决方案

java
Method method = ReflectionUtils.findMethod(targetClass, methodName, paramTypes);
if (method != null) {
    ReflectionUtils.makeAccessible(method);
    return ReflectionUtils.invokeMethod(method, target, args);
}

场景4:测试私有方法

场景描述:单元测试需要调用私有方法。

Spring 解决方案

java
Method privateMethod = ReflectionUtils.findMethod(service.getClass(), "validateData", String.class);
ReflectionUtils.makeAccessible(privateMethod);
Boolean result = (Boolean) ReflectionUtils.invokeMethod(privateMethod, service, "test");

3. 围绕主要场景的封装设计

3.1 封装设计目标

目标说明实现方式
简化 API一行代码完成常见反射操作提供高级封装方法
类型安全减少强制类型转换泛型方法设计
异常统一统一处理反射异常运行时异常包装
性能优化缓存 + 批量操作内置缓存策略
链式操作支持流畅的 API 调用返回 this 或 Builder

3.2 封装架构设计

3.3 封装 API 设计

3.3.1 门面类设计

java
/**
 * LinsirReflection - 反射工具门面类
 * 
 * 设计要点:
 * 1. 工具类,禁止实例化
 * 2. 所有方法静态,便于调用
 * 3. 泛型方法提供类型安全
 * 4. 异常统一包装为运行时异常
 * 5. 内置缓存提升性能
 */
public final class LinsirReflection {
    
    // 私有构造器
    private LinsirReflection() {
        throw new AssertionError("工具类禁止实例化");
    }
    
    // ==================== 方法操作 ====================
    
    /**
     * 查找方法(递归查找父类)
     * 
     * @param clazz 目标类
     * @param name 方法名
     * @param paramTypes 参数类型
     * @return Method 对象,未找到返回 null
     */
    public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes);
    
    /**
     * 调用方法(自动处理可访问性)
     * 
     * @param method 方法对象
     * @param target 目标对象
     * @param args 参数
     * @return 返回值
     * @throws ReflectionException 反射异常
     */
    public static Object invokeMethod(Method method, Object target, Object... args);
    
    /**
     * 类型安全的调用方法
     * 
     * @param method 方法对象
     * @param target 目标对象
     * @param args 参数
     * @param <T> 返回类型
     * @return 返回值
     */
    public static <T> T invokeMethod(Method method, Object target, Class<T> returnType, Object... args);
    
    /**
     * 批量处理方法
     * 
     * @param clazz 目标类
     * @param callback 处理回调
     * @param filter 过滤器(可选)
     */
    public static void doWithMethods(Class<?> clazz, MethodCallback callback, MethodFilter filter);
    
    // ==================== 字段操作 ====================
    
    /**
     * 查找字段(递归查找父类)
     * 
     * @param clazz 目标类
     * @param name 字段名
     * @return Field 对象,未找到返回 null
     */
    public static Field findField(Class<?> clazz, String name);
    
    /**
     * 获取字段值
     * 
     * @param field 字段对象
     * @param target 目标对象
     * @return 字段值
     */
    public static Object getFieldValue(Field field, Object target);
    
    /**
     * 类型安全的获取字段值
     * 
     * @param field 字段对象
     * @param target 目标对象
     * @param <T> 字段类型
     * @return 字段值
     */
    public static <T> T getFieldValue(Field field, Object target, Class<T> fieldType);
    
    /**
     * 设置字段值
     * 
     * @param field 字段对象
     * @param target 目标对象
     * @param value 字段值
     */
    public static void setFieldValue(Field field, Object target, Object value);
    
    /**
     * 批量处理字段
     * 
     * @param clazz 目标类
     * @param callback 处理回调
     * @param filter 过滤器(可选)
     */
    public static void doWithFields(Class<?> clazz, FieldCallback callback, FieldFilter filter);
    
    // ==================== 高级封装 ====================
    
    /**
     * 复制对象属性
     * 
     * @param source 源对象
     * @param target 目标对象
     * @param ignoreProperties 忽略的属性名
     */
    public static void copyProperties(Object source, Object target, String... ignoreProperties);
    
    /**
     * 获取所有字段值映射
     * 
     * @param object 目标对象
     * @return 字段名 -> 字段值 的映射
     */
    public static Map<String, Object> getFieldValues(Object object);
    
    /**
     * 调用指定名称的方法
     * 
     * @param target 目标对象
     * @param methodName 方法名
     * @param args 参数
     * @return 返回值
     */
    public static Object invokeMethodByName(Object target, String methodName, Object... args);
    
    /**
     * 获取指定注解标注的方法列表
     * 
     * @param clazz 目标类
     * @param annotationType 注解类型
     * @return 方法列表
     */
    public static List<Method> getAnnotatedMethods(Class<?> clazz, Class<? extends Annotation> annotationType);
    
    /**
     * 获取指定注解标注的字段列表
     * 
     * @param clazz 目标类
     * @param annotationType 注解类型
     * @return 字段列表
     */
    public static List<Field> getAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType);
    
    // ==================== 缓存管理 ====================
    
    /**
     * 清除反射缓存
     */
    public static void clearCache();
    
    /**
     * 获取缓存统计信息
     * 
     * @return 缓存统计
     */
    public static CacheStats getCacheStats();
}

3.3.2 回调接口设计

java
/**
 * 方法回调接口
 */
@FunctionalInterface
public interface MethodCallback {
    void doWith(Method method) throws IllegalArgumentException, IllegalAccessException;
}

/**
 * 方法过滤器接口
 */
@FunctionalInterface
public interface MethodFilter {
    boolean matches(Method method);
}

/**
 * 字段回调接口
 */
@FunctionalInterface
public interface FieldCallback {
    void doWith(Field field) throws IllegalArgumentException, IllegalAccessException;
}

/**
 * 字段过滤器接口
 */
@FunctionalInterface
public interface FieldFilter {
    boolean matches(Field field);
}

3.3.3 异常体系设计

java
/**
 * 反射操作异常
 */
public class ReflectionException extends RuntimeException {
    
    public ReflectionException(String message) {
        super(message);
    }
    
    public ReflectionException(String message, Throwable cause) {
        super(message, cause);
    }
    
    public ReflectionException(Throwable cause) {
        super(cause);
    }
}

/**
 * 方法调用异常
 */
public class MethodInvocationException extends ReflectionException {
    
    private final Method method;
    private final Object target;
    private final Object[] args;
    
    // 构造器和 getter...
}

/**
 * 字段访问异常
 */
public class FieldAccessException extends ReflectionException {
    
    private final Field field;
    private final Object target;
    
    // 构造器和 getter...
}

3.3.4 缓存设计

java
/**
 * 反射缓存管理器
 */
public class ReflectionCache {
    
    // 方法缓存:类 -> 方法数组
    private final ConcurrentMap<Class<?>, Method[]> declaredMethodsCache = 
        new ConcurrentHashMap<>(256);
    
    // 字段缓存:类 -> 字段数组
    private final ConcurrentMap<Class<?>, Field[]> declaredFieldsCache = 
        new ConcurrentHashMap<>(256);
    
    // 方法查找缓存:类+方法名+参数类型 -> Method
    private final ConcurrentMap<MethodCacheKey, Method> methodLookupCache = 
        new ConcurrentHashMap<>(256);
    
    // 字段查找缓存:类+字段名 -> Field
    private final ConcurrentMap<FieldCacheKey, Field> fieldLookupCache = 
        new ConcurrentHashMap<>(256);
    
    /**
     * 获取声明的方法(带缓存)
     */
    public Method[] getDeclaredMethods(Class<?> clazz);
    
    /**
     * 获取声明的字段(带缓存)
     */
    public Field[] getDeclaredFields(Class<?> clazz);
    
    /**
     * 缓存方法查找结果
     */
    public void cacheMethod(MethodCacheKey key, Method method);
    
    /**
     * 缓存字段查找结果
     */
    public void cacheField(FieldCacheKey key, Field field);
    
    /**
     * 清除缓存
     */
    public void clear();
    
    /**
     * 获取缓存统计
     */
    public CacheStats getStats();
}

3.4 使用示例

示例1:依赖注入场景

java
// 封装前(Spring 原生)
ReflectionUtils.doWithMethods(targetClass, method -> {
    if (method.isAnnotationPresent(Autowired.class)) {
        ReflectionUtils.makeAccessible(method);
        Object[] args = resolveDependencies(method);
        ReflectionUtils.invokeMethod(method, target, args);
    }
}, ReflectionUtils.USER_DECLARED_METHODS);

// 封装后
LinsirReflection.getAnnotatedMethods(targetClass, Autowired.class)
    .forEach(method -> {
        Object[] args = resolveDependencies(method);
        LinsirReflection.invokeMethod(method, target, args);
    });

示例2:属性复制场景

java
// 封装前
ReflectionUtils.doWithFields(source.getClass(), field -> {
    ReflectionUtils.makeAccessible(field);
    Object value = ReflectionUtils.getField(field, source);
    Field targetField = ReflectionUtils.findField(target.getClass(), field.getName());
    if (targetField != null) {
        ReflectionUtils.makeAccessible(targetField);
        ReflectionUtils.setField(targetField, target, value);
    }
});

// 封装后
LinsirReflection.copyProperties(source, target, "id", "createTime");

示例3:获取对象所有字段值

java
// 封装前
Map<String, Object> values = new HashMap<>();
ReflectionUtils.doWithFields(object.getClass(), field -> {
    ReflectionUtils.makeAccessible(field);
    values.put(field.getName(), ReflectionUtils.getField(field, object));
});

// 封装后
Map<String, Object> values = LinsirReflection.getFieldValues(object);

4. 扩展该模块分析

4.1 扩展点识别

4.2 扩展点详细设计

4.2.1 缓存策略扩展

扩展目标:支持不同的缓存策略(LRU、TTL、软引用等)

java
/**
 * 缓存策略接口
 */
public interface CacheStrategy<K, V> {
    
    /**
     * 获取缓存值
     */
    V get(K key);
    
    /**
     * 放入缓存
     */
    void put(K key, V value);
    
    /**
     * 移除缓存
     */
    void remove(K key);
    
    /**
     * 清空缓存
     */
    void clear();
    
    /**
     * 获取缓存大小
     */
    int size();
}

/**
 * LRU 缓存策略实现
 */
public class LruCacheStrategy<K, V> implements CacheStrategy<K, V> {
    private final LinkedHashMap<K, V> cache;
    private final int maxSize;
    
    public LruCacheStrategy(int maxSize) {
        this.maxSize = maxSize;
        this.cache = new LinkedHashMap<K, V>(maxSize, 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                return size() > maxSize;
            }
        };
    }
    
    // 实现接口方法...
}

/**
 * TTL 缓存策略实现(带过期时间)
 */
public class TtlCacheStrategy<K, V> implements CacheStrategy<K, V> {
    private final ConcurrentHashMap<K, CacheEntry<V>> cache;
    private final long ttlMillis;
    
    private static class CacheEntry<V> {
        final V value;
        final long expireTime;
        
        CacheEntry(V value, long ttlMillis) {
            this.value = value;
            this.expireTime = System.currentTimeMillis() + ttlMillis;
        }
        
        boolean isExpired() {
            return System.currentTimeMillis() > expireTime;
        }
    }
    
    // 实现接口方法...
}

扩展配置

java
// 配置 LRU 缓存
LinsirReflection.setCacheStrategy(new LruCacheStrategy<>(1000));

// 配置 TTL 缓存(5分钟过期)
LinsirReflection.setCacheStrategy(new TtlCacheStrategy<>(300000));

4.2.2 异常处理扩展

扩展目标:支持自定义异常处理策略

java
/**
 * 异常处理器接口
 */
public interface ExceptionHandler {
    
    /**
     * 处理方法调用异常
     * 
     * @param method 方法
     * @param target 目标对象
     * @param args 参数
     * @param exception 异常
     * @return 是否已处理
     */
    boolean handleMethodInvocationException(Method method, Object target, 
            Object[] args, Exception exception);
    
    /**
     * 处理字段访问异常
     * 
     * @param field 字段
     * @param target 目标对象
     * @param value 值(设置时)
     * @param exception 异常
     * @return 是否已处理
     */
    boolean handleFieldAccessException(Field field, Object target, 
            Object value, Exception exception);
}

/**
 * 日志记录异常处理器
 */
public class LoggingExceptionHandler implements ExceptionHandler {
    
    private static final Logger logger = LoggerFactory.getLogger(LoggingExceptionHandler.class);
    
    @Override
    public boolean handleMethodInvocationException(Method method, Object target, 
            Object[] args, Exception exception) {
        logger.error("方法调用失败: {}.{}, 参数: {}", 
            target.getClass().getName(), method.getName(), args, exception);
        return false; // 未处理,继续抛出
    }
    
    @Override
    public boolean handleFieldAccessException(Field field, Object target, 
            Object value, Exception exception) {
        logger.error("字段访问失败: {}.{}, 值: {}", 
            target.getClass().getName(), field.getName(), value, exception);
        return false;
    }
}

/**
 * 默认值异常处理器
 */
public class DefaultValueExceptionHandler implements ExceptionHandler {
    
    private final Map<Class<?>, Object> defaultValues = new HashMap<>();
    
    public DefaultValueExceptionHandler() {
        defaultValues.put(int.class, 0);
        defaultValues.put(long.class, 0L);
        defaultValues.put(boolean.class, false);
        defaultValues.put(String.class, "");
        // ... 其他默认值
    }
    
    @Override
    public boolean handleMethodInvocationException(Method method, Object target, 
            Object[] args, Exception exception) {
        Class<?> returnType = method.getReturnType();
        if (defaultValues.containsKey(returnType)) {
            // 返回默认值,标记为已处理
            return true;
        }
        return false;
    }
    
    @Override
    public boolean handleFieldAccessException(Field field, Object target, 
            Object value, Exception exception) {
        return false;
    }
}

4.2.3 安全控制扩展

扩展目标:控制反射访问的权限

java
/**
 * 反射安全管理器
 */
public interface ReflectionSecurityManager {
    
    /**
     * 检查是否允许访问方法
     * 
     * @param method 方法
     * @param caller 调用者类
     * @return 是否允许
     */
    boolean canInvoke(Method method, Class<?> caller);
    
    /**
     * 检查是否允许访问字段
     * 
     * @param field 字段
     * @param caller 调用者类
     * @param forWrite 是否为写入操作
     * @return 是否允许
     */
    boolean canAccess(Field field, Class<?> caller, boolean forWrite);
    
    /**
     * 检查是否允许设置可访问性
     * 
     * @param object 可访问对象
     * @param caller 调用者类
     * @return 是否允许
     */
    boolean canMakeAccessible(AccessibleObject object, Class<?> caller);
}

/**
 * 包级安全控制实现
 */
public class PackageSecurityManager implements ReflectionSecurityManager {
    
    private final Set<String> allowedPackages = new HashSet<>();
    private final Set<String> forbiddenPackages = new HashSet<>();
    
    public PackageSecurityManager() {
        // 默认禁止访问系统包
        forbiddenPackages.add("java.lang.reflect");
        forbiddenPackages.add("sun.reflect");
    }
    
    @Override
    public boolean canInvoke(Method method, Class<?> caller) {
        String packageName = method.getDeclaringClass().getPackage().getName();
        return !forbiddenPackages.contains(packageName) && 
               (allowedPackages.isEmpty() || allowedPackages.contains(packageName));
    }
    
    @Override
    public boolean canAccess(Field field, Class<?> caller, boolean forWrite) {
        // 禁止访问 final 字段的写入
        if (forWrite && Modifier.isFinal(field.getModifiers())) {
            return false;
        }
        String packageName = field.getDeclaringClass().getPackage().getName();
        return !forbiddenPackages.contains(packageName);
    }
    
    @Override
    public boolean canMakeAccessible(AccessibleObject object, Class<?> caller) {
        // 只允许访问同一包或公开 API
        return true;
    }
    
    public void allowPackage(String packageName) {
        allowedPackages.add(packageName);
    }
    
    public void forbidPackage(String packageName) {
        forbiddenPackages.add(packageName);
    }
}

4.2.4 方法匹配扩展

扩展目标:支持复杂的方法匹配规则

java
/**
 * 方法匹配器接口
 */
public interface MethodMatcher {
    
    /**
     * 匹配方法
     * 
     * @param method 方法
     * @return 是否匹配
     */
    boolean matches(Method method);
    
    /**
     * 是否匹配运行时参数
     * 
     * @param method 方法
     * @param args 参数
     * @return 是否匹配
     */
    default boolean matches(Method method, Object[] args) {
        return matches(method);
    }
}

/**
 * 注解方法匹配器
 */
public class AnnotationMethodMatcher implements MethodMatcher {
    
    private final Class<? extends Annotation> annotationType;
    
    public AnnotationMethodMatcher(Class<? extends Annotation> annotationType) {
        this.annotationType = annotationType;
    }
    
    @Override
    public boolean matches(Method method) {
        return method.isAnnotationPresent(annotationType);
    }
}

/**
 * 名称模式方法匹配器
 */
public class NamePatternMethodMatcher implements MethodMatcher {
    
    private final Pattern pattern;
    
    public NamePatternMethodMatcher(String regex) {
        this.pattern = Pattern.compile(regex);
    }
    
    @Override
    public boolean matches(Method method) {
        return pattern.matcher(method.getName()).matches();
    }
}

/**
 * 组合方法匹配器(支持 AND/OR)
 */
public class CompositeMethodMatcher implements MethodMatcher {
    
    private final List<MethodMatcher> matchers;
    private final boolean matchAll; // true = AND, false = OR
    
    public CompositeMethodMatcher(boolean matchAll, MethodMatcher... matchers) {
        this.matchAll = matchAll;
        this.matchers = Arrays.asList(matchers);
    }
    
    @Override
    public boolean matches(Method method) {
        if (matchAll) {
            return matchers.stream().allMatch(m -> m.matches(method));
        } else {
            return matchers.stream().anyMatch(m -> m.matches(method));
        }
    }
    
    public static MethodMatcher and(MethodMatcher... matchers) {
        return new CompositeMethodMatcher(true, matchers);
    }
    
    public static MethodMatcher or(MethodMatcher... matchers) {
        return new CompositeMethodMatcher(false, matchers);
    }
}

4.2.5 字段转换扩展

扩展目标:支持字段值的类型转换

java
/**
 * 字段转换器接口
 */
public interface FieldConverter {
    
    /**
     * 是否支持该类型的转换
     * 
     * @param sourceType 源类型
     * @param targetType 目标类型
     * @return 是否支持
     */
    boolean supports(Class<?> sourceType, Class<?> targetType);
    
    /**
     * 转换值
     * 
     * @param source 源值
     * @param targetType 目标类型
     * @return 转换后的值
     */
    Object convert(Object source, Class<?> targetType);
}

/**
 * 基础类型转换器
 */
public class PrimitiveFieldConverter implements FieldConverter {
    
    @Override
    public boolean supports(Class<?> sourceType, Class<?> targetType) {
        // 支持基本类型和包装类型之间的转换
        if (sourceType == targetType) return true;
        if (sourceType.isPrimitive() || targetType.isPrimitive()) {
            return isWrapperType(sourceType, targetType) || 
                   isWrapperType(targetType, sourceType);
        }
        return false;
    }
    
    private boolean isWrapperType(Class<?> type, Class<?> primitiveType) {
        if (!primitiveType.isPrimitive()) return false;
        if (primitiveType == int.class) return type == Integer.class;
        if (primitiveType == long.class) return type == Long.class;
        if (primitiveType == boolean.class) return type == Boolean.class;
        // ... 其他类型
        return false;
    }
    
    @Override
    public Object convert(Object source, Class<?> targetType) {
        if (source == null) return getDefaultValue(targetType);
        // 类型转换逻辑...
        return source;
    }
    
    private Object getDefaultValue(Class<?> type) {
        if (type == int.class || type == Integer.class) return 0;
        if (type == long.class || type == Long.class) return 0L;
        if (type == boolean.class || type == Boolean.class) return false;
        return null;
    }
}

/**
 * 字符串转换器
 */
public class StringFieldConverter implements FieldConverter {
    
    private final Map<Class<?>, Function<String, Object>> converters = new HashMap<>();
    
    public StringFieldConverter() {
        converters.put(int.class, Integer::parseInt);
        converters.put(Integer.class, Integer::parseInt);
        converters.put(long.class, Long::parseLong);
        converters.put(Long.class, Long::parseLong);
        converters.put(double.class, Double::parseDouble);
        converters.put(Double.class, Double::parseDouble);
        converters.put(boolean.class, Boolean::parseBoolean);
        converters.put(Boolean.class, Boolean::parseBoolean);
    }
    
    @Override
    public boolean supports(Class<?> sourceType, Class<?> targetType) {
        return sourceType == String.class && converters.containsKey(targetType);
    }
    
    @Override
    public Object convert(Object source, Class<?> targetType) {
        Function<String, Object> converter = converters.get(targetType);
        return converter != null ? converter.apply((String) source) : source;
    }
}

4.2.6 代理创建扩展

扩展目标:支持创建动态代理对象

java
/**
 * 代理工厂接口
 */
public interface ProxyFactory {
    
    /**
     * 创建代理对象
     * 
     * @param target 目标对象
     * @param interceptor 方法拦截器
     * @return 代理对象
     */
    Object createProxy(Object target, MethodInterceptor interceptor);
    
    /**
     * 创建接口代理
     * 
     * @param interfaces 接口数组
     * @param handler 调用处理器
     * @return 代理对象
     */
    Object createInterfaceProxy(Class<?>[] interfaces, InvocationHandler handler);
}

/**
 * 方法拦截器接口
 */
public interface MethodInterceptor {
    
    /**
     * 拦截方法调用
     * 
     * @param invocation 方法调用信息
     * @return 返回值
     * @throws Throwable 异常
     */
    Object invoke(MethodInvocation invocation) throws Throwable;
}

/**
 * 方法调用信息
 */
public interface MethodInvocation {
    
    Method getMethod();
    
    Object[] getArguments();
    
    Object getTarget();
    
    Object proceed() throws Throwable;
}

/**
 * JDK 动态代理工厂实现
 */
public class JdkProxyFactory implements ProxyFactory {
    
    @Override
    public Object createProxy(Object target, MethodInterceptor interceptor) {
        return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            (proxy, method, args) -> interceptor.invoke(
                new DefaultMethodInvocation(target, method, args))
        );
    }
    
    @Override
    public Object createInterfaceProxy(Class<?>[] interfaces, InvocationHandler handler) {
        return Proxy.newProxyInstance(
            Thread.currentThread().getContextClassLoader(),
            interfaces,
            handler
        );
    }
}

4.3 扩展配置示例

java
// 配置缓存策略
LinsirReflection.setCacheStrategy(new LruCacheStrategy<>(1000));

// 配置异常处理器
LinsirReflection.addExceptionHandler(new LoggingExceptionHandler());
LinsirReflection.addExceptionHandler(new DefaultValueExceptionHandler());

// 配置安全管理器
PackageSecurityManager securityManager = new PackageSecurityManager();
securityManager.forbidPackage("java.lang.reflect");
LinsirReflection.setSecurityManager(securityManager);

// 配置字段转换器
LinsirReflection.addFieldConverter(new PrimitiveFieldConverter());
LinsirReflection.addFieldConverter(new StringFieldConverter());

// 配置代理工厂
LinsirReflection.setProxyFactory(new JdkProxyFactory());

4.4 扩展点应用场景

扩展点应用场景实现复杂度
缓存策略高并发系统、内存敏感场景
异常处理日志记录、降级处理
安全控制多租户系统、沙箱环境
方法匹配AOP 切面、注解处理
字段转换配置绑定、数据映射
代理创建事务管理、权限控制

相关链接

基于 Apache 2.0 许可发布