JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

JAVA | 第2期 - 分享关于反射的一些辅助用法~

wys521 2025-02-13 14:43:19 精选教程 20 ℃ 0 评论

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();
   }
 }

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表