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 许可发布