来讲一讲反射机制中以下几种获得方法:
- 获取Class对象
- 获取属性
- 获取方法
- 获取构造器
- 注解信息的获取
其中我主要想讲的是这么多方法中Declared有无的区别,以及获取方法的方法中比较眼生的parameterTypes形参.
这里先给答案,带Declared的获取方法返回本类而不返回父类的属性/方法对象.
在开始之前先简单的介绍一下反射机制
java不是动态语言,但是通过反射机制使得java具有了动态性.
所谓的反射机制就是指一个类被加载后,JVM 会创建一个对应类的Class 对象,类的整个结构信息会被放到Class 对象中,而通过这个Class对象我们可以获得类的全部信息,并对其进行动态访问以及更改.
1 获取Class对象
主要有三种方式 都比较简单:
- 通过字节码文件获取(比如int.class)
- 对已创建的对象调用 getClass()方法
- 调用Class类中的静态方法 forName(String className)
第一种通过字节码文件获取Class对象是最简单的方式,但是正因为简单所以指向不明,一般用于当前包中的类 基本数据类型 以及void.
为了知道一个数据的类型,大家之前可能都用过getClass(),这个方法实际上就返回了一个Class对象.
第三种forName方法是最稳健的做法,className不光是类的名字而是一个包含完整包名的字符串,比如"cn.sxt.反射.User" 就像是导入类的写法.
2 获取属性
Class类提供了四个获取属性的方法:
- getDeclaredField(String name)
- getDeclaredFields()
- getField(String name)
- getFields()
getDeclaredField(String name)和 getField(String name) 方法返回的是一个Filed对象,需要提供指定属性的名称字符串.
而getDeclaredFields() 和getFields() 返回的是所有属性的集合Filed对象数组 Filed[]
Declared中文意思是声明 .
有无Declared的区别在于:
没有Declared的两个方法(getField(String name) 和getFields() )返回父类以及本类中public修饰的属性Filed对象
而带着Declared的两个方法(getDeclaredField(String name) 和getDeclaredFields() )返回本类中的所有属性而不返回父类中的属性
3 获取方法
与获取属性类似,Class提供了4种获取方法 返回的是Method对象或Method[]数组对象
- getDeclaredMethod(String name, Class<?>… parameterTypes)
- getDeclaredMethods()
- getMethod(String name, Class<?>… parameterTypes)
- getMethods()
getDeclaredMethods() 和getMethods() 返回Method[]数组对象
getDeclaredMethod(String name, Class<?>... parameterTypes) 和getMethod(String name, Class<?>… parameterTypes) 返回指定方法名的Method对象
有无Declared的区别与上述类似:
没有Declared的两个方法(getMethods()和getMethod() )返回父类以及本类中public修饰的方法Method对象.
而带着Declared的两个方法(getDeclaredMethod() 和getDeclaredMethods() )返回本类中所有方法的Method对象而不返回父类中的方法 .
值得注意的是getDeclaredMethod() 和getDeclaredMethods()这次不是返回所有方法,而是指返回公共方法.
方法可以同名重载,所以获取方法中另外Class<?>… parameterTypes就是指定一个或多个形参类型的Class对象,举三个例子:
1 一个类中有public void fun()方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m1=class.getMethod(“fun”);
或
Method m1=class.getMethod(“fun”,null);
2 一个类中有public void fun(int num)方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m2=class.getMethod(“fun”,int.class);
3 一个类中有public void fun(int num1,int num2,String name)方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m3=class.getMethod(“fun”,int.class,int.class,String.class);
4 获取构造器
同样是四种方法:
- getDeclaredConstructor(Class<?>… parameterTypes)
- getDeclaredConstructors()
- getConstructor(Class<?>… parameterTypes)
- getConstructors()
获取构造器的方法返回的都是本类的构造器.
这里有无Declared的区别在于:
有Declared的方法获得的是本类的所有构造器对象数组(包括private).
没有Declared的方法获得的是本类中public修饰的构造器对象数组.
形参Class<?>… parameterTypes与方法获取的使用方式相同.
获取注解信息的内容下期再见! 请点个赞吧亲