反射机制

本文深入讲解Java反射机制的核心概念,包括反射机制的作用、辅助类及其功能实现,如获取类、生成对象、获取构造方法、成员方法及成员变量,以及如何调用private方法。通过实例演示反射机制在Java中的应用。

一、反射机制的作用

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.获取类、属性、方法的修饰域

  类Class、Method、Constructor、Field都有一个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.youkuaiyun.com/annaleeya/article/details/8240510 (详细解析)

 

转载于:https://www.cnblogs.com/rookiechen/p/5303811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值