DAY28 Reflection

成员变量

获取指定的单个成员变量

可以通过,指定成员变量的变量名,从Class对象对应的类中,获取指定名称的public成员变量(Field对象表示), 
还可以获取到父类中定义的同名public成员变量(子类中)
Field getField(String name)
    Class sonClass = Son.class;
	Field i = sonClass.getField("i");
注:该方法,在类中查找指定名称的public的成员变量时,顺序是 先子类,如果子类中没有,再在父类中找;
如果子类,父类中都没找到指定名称的,成员变量,此时抛出异常NoSuchFieldException
在Class对象表示的类中,获取任意权限的指定名称的成员变量(不包括父类中定义的成员变量)
Field getDeclaredField(String name)
//获取类中定义的private成员变量
	Field name = sonClass.getDeclaredField("name");

使用获取到的成员变量: Object get(Object obj)

利用反射,可以做到访问对象的私有成员变量
Son sonObj = new Son("张三");
    //首先获取Son类中定义的name成员变量
Field name = sonClass.getDeclaredField("name");
	//破解权限问题
name.setAccessible(true); //张三
    //在指定对象上获取该成员变量的值
String o = (String) name.get(sonObj);//此处静态变量get.(null)
System.out.println(o);

设置成员变量的值:void set(Object obj, Object newValue)

Son son = new Son(false);
Field k = sonClass.getDeclaredField("k");
k.setAccessible(true);
k.set(son, true);//静态变量set(null, true)

成员方法

获取多个成员方法

Method[] getMethods()
获取当前Class对象表示类中的public成员方法, 也可以获取到当前类的父类中定义的public成员方法
Class clz = MethodClass.class;
Method[] methods = clz.getMethods();

Method[] getDeclaredMethods()
获取当前Class对象表示类中所有的成员方法(但是不包括父类中定义的)
Method[] declaredMethods = clz.getDeclaredMethods();

获取单个成员方法

通过指定 方法名 + 参数列表
String name 指定方法的名称
Class... parameterTypes 指定方法的,形参列表

Class clz = MethodClass.class;

Method getMethod(String name, Class... parameterTypes)
可以获取当前类及其父类中定义的public方法
Method publicMethod = clz.getMethod("publicMethod", int.class, String.class);//双参方法

Method getDeclaredMethod(String name, Class... parameterTypes)
只能获取当前类中定义的任意访问权限的方法(不包括父类中定义的方法)
Method privateMethod = clz.getDeclaredMethod("privateMethod");
//0参方法

通过反射获取到的方法的使用:Object invoke(Object obj, Object… args)

就是在指定对象上,传递实际参数,并调用该方法
Method对象.invoke(指定对象,方法运行所需要的实际参数)//静态方法没有指定对象,输入null

Method secondPrivate = clz.getDeclaredMethod("secondPrivate", int.class, String.class);
secondPrivate.setAccessible(true);
int result  = (int) secondPrivate.invoke(methodObj, 10, "张三");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值