今天主要来谈一谈反射中获取成员方法和成员变量的主要方法:
在获取之前我们首先创造两个类
Person类(父类):
1 public class Person {
2 private String name;//私有属性
3 public Integer age;//公共属性
4
5 public String getName() {
6 return name;
7 }
8
9 public void setName(String name) {
10 this.name = name;
11 }
12
13 public Person() {//空参构造
14 super();
15 }
16
17 public void paaa() {//公共方法
18
19 }
20
21 private void pbbb() {//私有方法
22
23 }
24 }
son类(子类):
1 public class son extends Person{//集成Person类
2 private int age;//私有属性
3 private String name;
4 public String cname;//公共属性
5 public void saaa() {//公共方法
6
7 }
8
9 private void sbbb() {//私有方法
10
11 }
12 }
前言:获取Class(反射)的三种方式以及获取对应对象的一个方法:
我们可以通过上述三种方法获取相对应的class,如果想要通过class获取对应的对象,就需要用newInstance方法:
1、获取父类和子类中的内容(公共的):
1)、获取父类和子类中的成员变量:
1 public static void getFields() throws ClassNotFoundException { 2 Class<?> son = Class.forName("com.offcn.wh.reflect.son"); 3 Field[] fields = son.getFields(); 4 for (Field field : fields) { 5 System.out.println(field); 6 } 7 }
结果如下
![](https://img2018.cnblogs.com/blog/1737646/201907/1737646-20190727143808466-1904256361.png)
根据结果可以看出获取了父类和子类中的公共成员变量
2)、获取父类和子类的成员方法:
1 public static void getMethod() throws ClassNotFoundException {
2 Class<?> son = Class.forName("com.offcn.wh.reflect.son");
3 Method[] methods = son.getMethods();
4 for (Method method : methods) {
5 System.out.println(method);
6 }
7 }
结果如下
![](https://img2018.cnblogs.com/blog/1737646/201907/1737646-20190727144458390-502767734.png)
根据结果可以看出此方法获取的是所有“上”类中的方法
3)、获取构造方法:
1 public static void constructor() throws Exception {
2 Class<?> son = Class.forName("com.offcn.wh.reflect.son");
3 Constructor<?>[] constructors = son.getConstructors();
4 for (Constructor<?> constructor : constructors) {
5 System.out.println(constructor);
6 }
7 }
结果如下
![](https://img2018.cnblogs.com/blog/1737646/201907/1737646-20190727145812650-842044663.png)
根据结果可以看出此方法获取的是本类的所有构造方法
其实能获取的还有很多,比如本类的接口等等,大家可以尝试一下,基本上类中有的东西都可以获取到
2、获取子类中的私有内容
通过getDeclaredxxx的方法(又称为暴力反射)来获取,比如说变量:
1 public static void getFields() throws ClassNotFoundException {
2 Class<?> son = Class.forName("com.offcn.wh.reflect.son");
3 Field[] fields = son.getDeclaredFields();
4 for (Field field : fields) {
5 System.out.println(field);
6 }
7 }
结果如下
![](https://img2018.cnblogs.com/blog/1737646/201907/1737646-20190727150734786-1540904751.png)
根据结果可以看出此方法获取的是本类的所有所有属性
3、改变子类中的私有内容(以私有属性为例)
我们通过暴力反射获取了私有内容后会发现根本无法使用,会报如下图的错误:
代码:
1 public static void setFields() throws Exception{ 2 Class<?> class1 = Class.forName("com.offcn.wh.reflect.Son"); 3 Son son = (Son) class1.newInstance();//通过反射拿到对象 4 Field field = class1.getDeclaredField("name");//根据属性名称获取属性 5 field.set(son, "wh");//与son.setName("wh")相同 6 System.out.println(son.getName()); 7 }
错误:
这时就需要设置私有属性的Accessible属性为true,然后再进行修改
4、获取父类中的私有属性、方法
在上边的实例中我们获取了除父类私有内容外的所有内容,下面我们就来获取一下父类的私有内容(以私有方法为例)
getField只能获取本类和父类中的所有属性,getDeclaredField只能获取本类的所有属性,所以要想获取父类的私有属性只有先去获取父类的字节码对象
获取父类的方法:getSuperclass();
具体代码如下:
1 public static void getSuper() throws ClassNotFoundException { 2 Class<?> son = Class.forName("com.offcn.wh.reflect.Son"); 3 Class<?> superclass = son.getSuperclass();//获取父类字节码对象 4 Field[] fields = superclass.getDeclaredFields();//获取父类的所有属性 5 for (Field field : fields) { 6 System.out.println(field); 7 } 8 }
5、总结
我们只要掌握了反射,就可以获取类的字节码对象,然后通过方法获取类中的内容,getxxx()为获取本类和父类的公共方法,getDeclaredxxx()为获取本类的所有内容,如果想修改或者使用私有内容,就需要设置xxx.setAccessible(true)来获取访问权限,对于父类的私有内容我们可以通过getSuperclass()来获取父类的字节码对象,然后再去获取私有内容。
我的个人公众号会不定时更新我的java学习之路,大家如果也在学习java可以在公众号上边与我交流哦。