从来就没有救世主  也不靠神仙皇帝  要创造人类的幸福  全靠我们自己  

反射

 

1. 什么是反射

  在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法。对任意一个对象,能调用它的任意一个方法和属性。

  要想使用反射,需要获取 类的字节码文件对象。

 

  反射就是把java类中各种成分映射成 java 对象(成员变量、方法、构造、包等信息映射成对象) 

 

  当第一次new一个对象时,jvm去磁盘中找到 class 文件,加载到jvm内存中,创建一个 Class 对象(一个类只产生一个Class对象)。则通过这个Class对象就知道了类有哪些方法、哪些成员(私有成员还是受保护的)。

 

相关的类:

  Class类:代表类实体

  Field类:类的成员变量/类的属性

  Method:类的方法

  Constructor:类的构造方法

 

2. 获取Class对象的方式

  ①Object类的 getClass() 方法

  ②任何数据类型(包括基本类型)都有静态 class 属性

  ③Class类的静态方法 Class.forName(String className)

-------------------------------------------------------------------------------------------------------------------------------------

类加载:

  

Class class = Class.forName(String className)

  加载 .class 文件到jvm,执行类的static代码块

ClassLoader loader = ClassLoader.getSystemClassLoader();
Class<?> class = loader.loadClass(className);

  只加载class到jvm,不执行static代码块     

---------------------------------------------------------------------------------------------------------------------------------------

  Class类对象的方法:

(1)获取构造

public Constructor[] getConstructors()          //获取"公有的"构造方法
public Constructor[] getDeclaredConstructors()  //获取所有的构造方法(包括私有、保护、默认、公有)

public Constructor getConstructor(Class... parameterTypes)  //获取单个"公有的"构造方法
public Constructor getDeclaredConstructor(Class... parameterTypes)  //获取单个构造方法

  要创建对象,调用 Constructor对象的 newInstance() 方法,如果获取的是有参的构造,则newInstance() 也要传入相应的参数。

  获取private构造,不能直接直接用此构造对象newInstance创建对象(可以先调用 setAccessible获取权限,然后调用私有构造创建对象)

 

(2)获取成员变量

Field[] getFields()          //获取所有public字段
Field[] getDeclaredFields()  //获取所有public、private、默认、protected字段

Field getField(String fieldName)  //获取一个public字段
Field getDeclaredField(String fieldName) //获取任意一个字段

  void set(Object obj,Object value)  obj:对象    value:为字段设的值

 

(3)获取方法

Method[] getMethods()     //获取所有public方法
Method[] getDeclaredMethods() //获取所有方法

Method getMethod(String name,Class<?>... parameterTypes) //获取一个public方法,name指定名字,后面的参数指定是哪个重载方法
Method getDeclaredMethod(String name,Class<?>... parameterTypes)  //获取一个方法

  调用方法:  Object invoke(Object obj,Object... arg)  obj为对象,args为实参

  调用静态方法:第一个参数obj传null即可

  

 

 

3. 反射的作用

(1)通过反射运行配置文件内容

  用配置文件指定类、方法等,当需要修改功能时,修改配置文件内容为另一个类、方法即可。灵活性更高。

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-06-06 14:40  T,X  阅读(170)  评论(0编辑  收藏  举报