反射-类信息

反射-类信息

反射可以在运行时获取类、方法以及属性的信息

通过反射,可以在运行时获取类各方面的信息,包括类名信息、包信息、修饰符、超类信息、接口信息、方法信息、属性信息、构造函数以及注解等信息.

类名信息

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的注解,也就是只能获取到运行时注解.

##参考信息

  1. http://stackoverflow.com/questions/15202997/what-is-the-difference-between-canonical-name-simple-name-and-class-name-in-jav
您的支持将鼓励我继续创作!