20240220

2024/2/20

# 1 反射

Java反射机制允许程序在运行时获取类的详细信息(如类名、属性、方法、构造器等)并进行操作,无需在编译期知道具体的类或对象。这为动态加载和操作类提供了强大的灵活性。

以下是一些主要的反射API类以及它们提供的关键方法:

  1. java.lang.Class

    • Class<?> clazz = Class.forName("com.example.MyClass");:通过类名字符串加载并返回指定类的Class对象。
    • clazz.getDeclaredFields():返回该类及其所有超类中声明的所有字段,包括私有(private)字段。
    • clazz.getDeclaredMethods():返回此Class对象表示的类或接口声明的所有方法,包括私有方法。
    • clazz.getConstructors():返回表示此Class对象所表示的类的所有公共构造方法的Constructor对象数组。
    • clazz.newInstance():创建并初始化这个Class对象所表示的类的一个新实例。前提是该类有一个无参数的构造函数。
  2. java.lang.reflect.Field

    • field.setAccessible(true):允许访问私有成员变量。
    • field.get(obj):获取指定对象obj上的此Field对象表示的字段值。
    • field.set(obj, value):将给定对象obj上此Field对象表示的字段设置为指定的新值。
  3. java.lang.reflect.Method

    • method.invoke(obj, args...):在指定的对象obj上调用此Method对象表示的方法,并传递给定的参数args,返回该方法的结果或者抛出异常。
    • method.getParameterTypes():返回表示此方法的形参类型的数组。
    • method.setAccessible(true):使私有方法也可以被调用。
  4. java.lang.reflect.Constructor

    • constructor.newInstance(args...):使用给定参数创建并初始化此Constructor表示的类的新实例。
    • constructor.getParameterTypes():返回一个类型数组,这些类型描述了此构造方法的形参。
  5. AnnotatedElement接口

    • 这个接口由Class、Constructor、Field和Method类实现,提供了一系列用于获取注解的方法:
      • getAnnotation(Class<T> annotationClass):获取该元素上存在的指定类型的注解。
      • getAnnotations():返回该元素上所有的注解。

此外,还有更多其他辅助方法,例如判断类是否实现了某个接口、获取类的父类、获取包信息等。反射机制强大而灵活,但过度使用可能会影响性能,因为它绕过了JVM的一些优化措施,所以在实际开发中应合理使用。