20240220
ccnaive 2024/2/20
# 1 反射
Java反射机制允许程序在运行时获取类的详细信息(如类名、属性、方法、构造器等)并进行操作,无需在编译期知道具体的类或对象。这为动态加载和操作类提供了强大的灵活性。
以下是一些主要的反射API类以及它们提供的关键方法:
java.lang.Class
Class<?> clazz = Class.forName("com.example.MyClass");
:通过类名字符串加载并返回指定类的Class对象。clazz.getDeclaredFields()
:返回该类及其所有超类中声明的所有字段,包括私有(private)字段。clazz.getDeclaredMethods()
:返回此Class对象表示的类或接口声明的所有方法,包括私有方法。clazz.getConstructors()
:返回表示此Class对象所表示的类的所有公共构造方法的Constructor对象数组。clazz.newInstance()
:创建并初始化这个Class对象所表示的类的一个新实例。前提是该类有一个无参数的构造函数。
java.lang.reflect.Field
field.setAccessible(true)
:允许访问私有成员变量。field.get(obj)
:获取指定对象obj上的此Field对象表示的字段值。field.set(obj, value)
:将给定对象obj上此Field对象表示的字段设置为指定的新值。
java.lang.reflect.Method
method.invoke(obj, args...)
:在指定的对象obj上调用此Method对象表示的方法,并传递给定的参数args,返回该方法的结果或者抛出异常。method.getParameterTypes()
:返回表示此方法的形参类型的数组。method.setAccessible(true)
:使私有方法也可以被调用。
java.lang.reflect.Constructor
constructor.newInstance(args...)
:使用给定参数创建并初始化此Constructor表示的类的新实例。constructor.getParameterTypes()
:返回一个类型数组,这些类型描述了此构造方法的形参。
AnnotatedElement接口
- 这个接口由Class、Constructor、Field和Method类实现,提供了一系列用于获取注解的方法:
getAnnotation(Class<T> annotationClass)
:获取该元素上存在的指定类型的注解。getAnnotations()
:返回该元素上所有的注解。
- 这个接口由Class、Constructor、Field和Method类实现,提供了一系列用于获取注解的方法:
此外,还有更多其他辅助方法,例如判断类是否实现了某个接口、获取类的父类、获取包信息等。反射机制强大而灵活,但过度使用可能会影响性能,因为它绕过了JVM的一些优化措施,所以在实际开发中应合理使用。