1、释义
Java 反射(Reflection)是一个强大的特性,它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态的操作类的能力,这在很多框架和库中被广泛使用,例如 Spring 框架的依赖注入功能。
2、常见反射 API
java.lang.Class
java.lang.ClassLoader
java.lang.reflect.Field
java.lang.reflect.Parameter
java.lang.reflect.Method
java.lang.reflect.Constructor
3、Class 中常用的 API
- class.getFields() - 获取对应class定义的所有public字段(包括父类);
- class.getDeclaredFields() - 获取对应class中定义的所有字段,并且忽略修饰符(仅当前类);
- class.getConstructors() - 获取对应class定义的所有public构造函数(不包括父类);
- class.getDeclaredConstructors() - 获取对应class定义的所有构造,并且忽略修饰符(不含父类);
- class.getMethods() - 获取对应class定义的 public 方法(包括父类);
- class.getDeclaredMethods() - 获取对应class定义的所有方法,忽略修饰符(仅当前类);
- class.getResource(
) - 获取class同级文件夹中的资源(路径与 class 同级); - class.getResourceAsStream(
) - 获取class同级文件夹中的资源流(路径与 class 同级); - class.getInterfaces() - 获取对应class实现的的所有接口;
- class.getSuperclass() - 获取对应class的所有父类;
- class.getPackage() - 获取对应class所在的包;
4、普通用法
Field[] fields = User.class.getDeclaredFields();
for (Field field : fields) {
boolean isPrimitiveBoolean = boolean.class == field.getType();
String fieldName = field.getName();
String methodName = StringUtils.capitalize(fieldName);
String getterName = (isPrimitiveBoolean ? "is" : "get") + methodName; // 手动拼接 get/is 方法名,例如:getUsername()
String setterName = "set" + methodName; // 手动拼接 set 方法名,例如:setUsername()
Method getter = User.class.getDeclaredMethod(getterName);
Method setter = User.class.getDeclaredMethod(setterName, field.getType());
System.out.println(field.getName());
System.out.println("# getter: " + getter);
System.out.println("# setter: " + setter);
System.out.println();
}
5、高级用法
5.1、拿到类中某个字段的 getter/setter 方法:
PropertyDescriptor descriptor = new PropertyDescriptor("property", Bean.class);
Method getter = descriptor.getReadMethod();
Method setter = descriptor.getWriteMethod();
5.2、拿到某个类中所有字段的 getter/setter 方法:
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor descriptor : propertyDescriptors) {
if (Class.class != descriptor.getPropertyType()) {
Method getter = descriptor.getReadMethod(); // getter
Method setter = descriptor.getWriteMethod(); // setter
System.out.println(descriptor.getName());
System.out.printf("# getter: %s\n", getter);
System.out.printf("# setter: %s\n", setter);
System.out.printf("# declaring class : %s\n", getter.getDeclaringClass());
System.out.println();
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)