反射机制

一、反射机制的作用

1,反编译:.class-->.java

2,通过反射机制访问java对象的属性,方法,构造方法等;

二、反射机制中的辅助类及其作用

java.lang.Class;                

java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

Android反射机制实现与原理 - Nelson - Nelson

三、具体功能实现

   1.反射机制获取类

//第一种方式:  
Classc1 = Class.forName("Employee");  
//第二种方式:  
//java中每个类型都有class 属性.  
Classc2 = Employee.class;  
   
//第三种方式:  
//java语言中任何一个java对象都有getClass 方法  
Employeee = new Employee();  
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)  

注:

Class本身就是一个类,Class是该类的名称。看下面这个类的定义:

public class MyButton extends Button {...}

注意到上面的class的首字母是小写,它表示的是一种类类型,但是我们的Class是一个类,相当于上面定义的MyButton类。所以,千万不要把这里的Class做为一个类类型来理解。

Class类是整个Java反射机制的源头,Class类本身表示Java对象的类型,我们可通过一个Object对象的getClass()方法取得一个对象的类型,此函数返回的就是一个Class类。

   2.通过类生成对象

Class myClass = Class.forName("Employee");//获取Employee类
Employee employee =(Employee) myClass.newInstance();//生成Employee对象
//注:调用的只能是Employee的无参数构造方法

//同下方式
Employee employee1 = new Employee();

   3.获取构造方法

Class类提供了四个public方法,用于获取某个类的构造方法。

Constructor getConstructor(Class[] params)     根据构造函数的参数,返回一个具体的具有public属性的构造函数

Constructor getConstructors()     返回所有具有public属性的构造函数数组

Constructor getDeclaredConstructor(Class[] params)     根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)

Constructor getDeclaredConstructors()    返回该类中所有的构造函数数组(不分public和非public属性)

   4.获取类的成员方法

与获取构造方法的方式相同,存在四种获取成员方法的方式。

Method getMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的具有public属性的方法

Method[] getMethods()    返回所有具有public属性的方法数组

Method getDeclaredMethod(String name, Class[] params)    根据方法名和参数,返回一个具体的方法(不分public和非public属性)

Method[] getDeclaredMethods()    返回该类中的所有的方法数组(不分public和非public属性)

注意

在获取类的成员方法时,有一个地方值得大家注意,就是getMethods()方法和getDeclaredMethods()方法。

getMethods():用于获取类的所有的public修饰域的成员方法,包括从父类继承的public方法和实现接口的public方法

getDeclaredMethods():用于获取在当前类中定义的所有的成员方法和实现的接口方法,不包括从父类继承的方法。

    5.获取类的成员变量(成员属性)

存在四种获取成员属性的方法

Field getField(String name)    根据变量名,返回一个具体的具有public属性的成员变量

Field[] getFields()    返回具有public属性的成员变量的数组

Field getDeclaredField(String name)    根据变量名,返回一个成员变量(不分public和非public属性)

Field[] getDelcaredField()    返回所有成员变量组成的数组(不分public和非public属性)

  6.获取类、属性、方法的修饰域

  类ClassMethodConstructorField都有一个public方法int getModifiers()。该方法返回一个int类型的数,表示被修饰对象( Class、 Method、 Constructor、 Field )的修饰类型的组合值。

  在开发文档中,可以查阅到,Modifier类中定义了若干特定的修饰域,每个修饰域都是一个固定的int数值,列表如下:

    Android反射机制实现与原理 - Nelson - Nelson

  该类不仅提供了若干用于判断是否拥有某中修饰域的方法boolean isXXXXX(int modifiers),还提供一个String toString(int modifier)方法,用于将一个表示修饰域组合值的int数转换成描述修饰域的字符串。

    Android反射机制实现与原理 - Nelson - Nelson

四、如何调用private方法

http://blog.csdn.net/annaleeya/article/details/8240510 (详细解析)

原文地址:https://www.cnblogs.com/rookiechen/p/5303811.html