反射-类信息
反射可以在运行时获取类、方法以及属性的信息
通过反射,可以在运行时获取类各方面的信息,包括类名信息、包信息、修饰符、超类信息、接口信息、方法信息、属性信息、构造函数以及注解等信息.
类名信息
getName, getSimpleName(不包含包名信息), getCanonicalName, getTypeName
getName返回的名称一般是用于Class.forName,用来动态地加载类信息
getCanonicalName返回的名称一般是用于import操作中,也可用于日志输出
getSimpleName不包含包信息
包信息
包信息被封装在Package类中,通过这个类可以获取包信息,比如包名等
修饰符
修饰符是用一个整形数字来表示,可以通过Modifier来进行解析, 包括private/protected/public, native, static, synchronized等信息
超类信息
通过getSuperClass获取,获取的也是Class对象,同样可以通过反射机制获取其相应的信息
接口信息
通过getInterfaces获取,注意这里只获取这个类显式声明实现的接口,对于它的超类中声明实现的接口信息,通过这个方法是无法返回的, 需要通过递归的方式来获取完整的接口信息.
方法信息
通过getMethods或者getDeclaredMethods来获取,前者获取类所有的方法,包括在超类中声明的方法,后者则只会获取在当前类中声明的方法, 包括public/protected/default/private.
构造函数信息
通过getConstructors或者getDeclaredConstructors()来获取,其中getConstructor获取到所有public构造函数列表,而getDeclaredConstructors则可以获取到所有的构造函数,包括public/protect/default/private的构造函数
如果知道构造函数的参数类型及顺序, 可以通过getContructor来获取指定的构造函数.
可以通过构造函数对象初始化该类的实例, newInstance
属性信息
getFields或者getDeclaredFields来获取,两者的区别与前面相同
通过getField方法,可以指定属性名称来获取相应的属性Field对象.
获取到Field对象后,可以对get/set设置相应实例的值
注解信息
getAnnotations或者getDeclaredAnnotations来获取,两者的区别与前面的相同. 注意,这里只能获取到那些Retention = RetentionPolicy.RUNTIME的注解,也就是只能获取到运行时注解.
##参考信息