Java反射机制

9 篇文章 0 订阅

反射

概述:AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。
而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象

三种方式

Object类的getClass()方法,判断两个对象是否是同一个字节码文件
静态属性class,锁对象
Class类中静态方法forName(),读取配置文件

获取Class对象的三种方式

1、new Person().getClass();
2、Person.getClass();
3、Class.forName();

获取构造方法

//获取多个看得见的构造函数
Constructor[] cons = c.getConstructors();
//获取所有的构造函数
Constructor[]  cons1 = c.getDeclaredConstructors();
//获取单个构造函数
    //返回能看见的无参构造函数对象 
    Constructor con1 =  c.getConstructor();
    Object obj = con1.newInstance();
	//返回能看见的带参构造函数对象 
	Constructor con2 =  c.getConstructor(String.class,int.class);
	Object obj1 = con2.newInstance("张三"15);
	//返回私有构造函数的对象,都能获取
	Constructor con3 =  c.getDeclaredConstructor(String.class);
	con3.setAccessible(true);
	Object obj2 = con3.newInstance("zhangsan");

获取成员变量

Class  c = Class.forName(path);
Constructor con = c.getConstructor();
Object obj = con.newInstance;

//获取所有的公共的成员变量
Field[] fields1 = c.getFields();
//获取所有的成员变量
Field[] fields2 = c.getDeclaredFields();

//获取单个公共的成员变量
Field  addressField = c.getField("name");
String s = addressField.set(obj,"zhangsan");
//获取私有的成员变量(所有的)
Field idField = c.getDeclaredField("id");
idField.setAccessible(true);
String id = idField.set(obj,"430...01");

获取方法

Constructor con = c.getConstructor();
Object obj = con.newInstance();
//获取自己包含父类的所有公共方法
Method[] methods1 = c.getMethods();
//获取自己的所有方法(没有父类的)
Method[] methods2 = c.getDeclaredMethods();
//获取单个公共的方法
Method method3 = c.getMethod(methodName,String.class);	//methodName=show
//调用obj对象的show(String s,int i)
method3.invoke(obj,"zhangsan",22);
//获取单个的私有方法(所有方法)
Method method4 = c.getDeclaredMethod(methodName2);	//methodName2=run
method4.setAccessible(true);//取得访问权限
method4.invoke(obj);

越过泛型检查

设置某对象指定值

此方法可将obj对象中名为propertyName的属性的值设置为value

public void setProperty(Object obj, String propertyName, Object value){}

反射的动态代理

在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib,Proxy类中的方法创建动态代理类对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
最终会调用InvocationHandler的方法
InvocationHandler Object invoke(Object proxy,Method method,Object[] args)

Android中的应用

​ 1、通过原始的Java反射机制的方式调用资源
2、Activity的启动过程中Activity的对象的创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值