反射的做用:经过反射获取属性和方法

今天主要来谈一谈反射中获取成员方法和成员变量的主要方法:html

在获取以前咱们首先创造两个类java

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类(子类):this

 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(反射)的三种方式以及获取对应对象的一个方法:spa

 

 

咱们能够经过上述三种方法获取相对应的class,若是想要经过class获取对应的对象,就须要用newInstance方法:3d

    

一、获取父类和子类中的内容(公共的):code

  1)、获取父类和子类中的成员变量: htm

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 }
  
  结果以下
      
    根据结果能够看出获取了父类和子类中的公共成员变量

  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 }
  结果以下
    

       根据结果能够看出此方法获取的是全部“上”类中的方法blog

    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 }
  结果以下
    

     根据结果能够看出此方法获取的是本类的全部构造方法

 

 其实能获取的还有不少,好比本类的接口等等,你们能够尝试一下,基本上类中有的东西均可以获取到

二、获取子类中的私有内容

  经过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 }
  结果以下
      

    根据结果能够看出此方法获取的是本类的全部全部属性  

三、改变子类中的私有内容(以私有属性为例)   

   咱们经过暴力反射获取了私有内容后会发现根本没法使用,会报以下图的错误:

   代码:

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,而后再进行修改

  

 

四、获取父类中的私有属性、方法

  在上边的实例中咱们获取了除父类私有内容外的全部内容,下面咱们就来获取一下父类的私有内容(以私有方法为例)

  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 }

 

五、总结

  咱们只要掌握了反射,就能够获取类的字节码对象,而后经过方法获取类中的内容,getxxx()为获取本类和父类的公共方法,getDeclaredxxx()为获取本类的全部内容,若是想修改或者使用私有内容,就须要设置xxx.setAccessible(true)来获取访问权限,对于父类的私有内容咱们能够经过getSuperclass()来获取父类的字节码对象,而后再去获取私有内容。

  个人我的公众号会不定时更新个人java学习之路,你们若是也在学习java能够在公众号上边与我交流哦。

原文出处:https://www.cnblogs.com/apbddpz/p/11255182.html

相关文章
相关标签/搜索