springframework 反射工具类 ReflectionUtils

springframework 反射工具类 ReflectionUtils

org.springframework.util.ReflectionUtils 封装了常用反射操作。

private static Field[] getDeclaredFields(Class<?> clazz);

该方法使用Class#getDeclaredFields()返回该Class表示的类或接口声明的所有字段,包括public, protected, default (package) access, 和 private字段,但是不包括继承的字段。
但ReflectionUtils做了缓存处理,以避免JVM的SecurityManager检查和防御性数组复制。

@FunctionalInterface
public interface MethodFilter {

	/**
	 * Determine whether the given method matches.
	 * @param method the method to check
	 */
	boolean matches(Method method);
}

函数式接口,主要用于指定规则匹配Method 。

/**
* Action to take on each method.
 */
@FunctionalInterface
public interface MethodCallback {

	/**
	 * Perform an operation using the given method.
	 * @param method the method to operate on
	 */
	void doWith(Method method) throws IllegalArgumentException, IllegalAccessException;
}

函数式接口,对Method 进行操作。

@FunctionalInterface
public interface FieldFilter {

	/**
	 * Determine whether the given field matches.
	 * @param field the field to check
	 */
	boolean matches(Field field);
}

函数式接口,主要用于指定规则匹配Field 。

@FunctionalInterface
public interface FieldCallback {

	/**
	 * Perform an operation using the given field.
	 * @param field the field to operate on
	 */
	void doWith(Field field) throws IllegalArgumentException, IllegalAccessException;
}

函数式接口,对Field 进行操作。

public static void makeAccessible(Field field);

在必要时使给定的字段可访问。
仅在实际需要时(字段非public,字段所属类非public等情况)才调用Field#setAccessible(true)方法,以避免与JVM SecurityManager发生不必要的冲突(如果处于活动状态)。

public static boolean isPublicStaticFinal(Field field);

判断给定字段是否为“public static final”常量。

public static void doWithFields(Class<?> clazz, FieldCallback fc, @Nullable FieldFilter ff);

该方法会获取目标类public, protected, default (package) access, 和 private字段(包括继承), 然后使用FieldFilter ff筛选满足条件的Field,最后对所有满足条件的Field执行FieldCallback fc操作。

public static void doWithFields(Class<?> clazz, FieldCallback fc);

相对于以上方法,不会对字段进行筛选。

public static void doWithLocalFields(Class<?> clazz, FieldCallback fc);

相对以上方法,不会对继承的字段进行操作。

public static void shallowCopyFieldState(final Object src, final Object dest);

给定源对象和目标对象(它们必须是相同的类或子类,或者目标对象是源对象的子类),复制所有字段,包括继承的字段。
这个方法在内部会调用doWithFields(Class<?> clazz, FieldCallback fc)方法,FieldCallback fc为如下lambda表达式:

field -> {
	makeAccessible(field);
	Object srcValue = field.get(src);
	field.set(dest, srcValue);
}
public static Object getField(Field field, @Nullable Object target);

获取指定target对象上field字段值。
内部调用Field#get(Object)方法,如果发生异常,则将异常处理为运行时异常。

public static void setField(Field field, @Nullable Object target, @Nullable Object value);

将target对象field字段值设置为value;
内部调用 Field#set(Object, Object)方法,如果发生异常,则将异常处理为运行时异常。

public static Field findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type)

尝试在给定类上clazz找到具有给定名称name和(或者)类型type的字段。 搜索所有父类直至Object。

public static Field findField(Class<?> clazz, String name);

相对以上方法,没有指定字段的类型。

public static void makeAccessible(Method method);

使给定的方法可访问,并在必要时显式设置它的可访问性。
仅在实际需要时才调用setAccessible(true)方法,以避免与JVM SecurityManager发生不必要的冲突(如果处于活动状态)。

public static boolean isCglibRenamedMethod(Method renamedMethod);

判断给定的方法是否为CGLIB重命名方法。 CGLIB重命名方法的方法名应满足正则表达式"CGLIB$methodName$0"。

public static boolean isObjectMethod(@Nullable Method method);

判断给定方法是否由java.lang.Object声明。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值