反射入门
一. 引言&概述
为了能够更加灵活地访问类中的所有内容(包含private),我们就需要反射技术
反射:针对性地映射 某一个完整事物的行为或特征(单独操作类中任意内容 的超能力)
针对性地获取 某一个类的成员方法/成员变量
灵活地使用Java类
二. 入门案例1:强制执行private方法
代码实现:
/*
* 需求:在测试类中,调用Person类的t1方法
* */
public static void main(String[] args) throws Exception {
//1、获取
//1.1、获取类 对象 (相当于获取到整个西瓜)
Class> clazz = Class.forName("com.czxy.demo1.Person");
//1.2、通过类对象,获取方法 (相当于通过超能力从西瓜中,取出西瓜瓤)
Method t1 = clazz.getDeclaredMethod("t1");
//1.3、设置类外可用
t1.setAccessible(true);
//2、执行 (相当于吃西瓜瓤)
//2.1、通过类对象,获取构造方法
Constructor> c = clazz.getConstructor();
//2.2、通过构造方法创建对象 (相当于 Person person = new Person();)
Object person = c.newInstance();
//2.3、调用方法 (相当于person.t1())
t1.invoke(person);
}
注意事项:
技巧:获取全类名
小结:
反射:针对性获取 某个类中的所有成员方法/成员变量
反射步骤:
1、获取
1.1、获取类对象(获取这个类所有内容)
1.2、通过类对象,获取方法
1.3、设置类外可用 (暴力反射,private)
2、执行
2.1、通过类对象 ,获取构造方法
2.2、通过构造方法,创建对象(2.1和2.2 相当于Person p =new Person())
2.3、调用方法(相当于p.方法())
三. 入门案例2:强制执行private带参数的方法
代码实现:
/*
* 需求:在测试类中,调用Person类的t3方法 带参
* */
public static void main(String[] args) throws Exception {
//1、获取
//1.1、获取类 对象
Class> clazz = Class.forName("com.czxy.demo1.Person");
//1.2、通过类对象,获取方法 (方法名:t3 参数列表:String int)
Method t3 = clazz.getDeclaredMethod("t3",String.class,int.class);
//1.3、设置类外可用 (暴力反射)
t3.setAccessible(true);
//2、执行 (相当于吃西瓜瓤)
//2.1、通过类对象,获取构造方法
Constructor> c = clazz.getConstructor();
//2.2、通过构造方法创建对象 (相当于 Person person = new Person();)
Object person = c.newInstance();
//2.3、调用方法 (相当于person.t3("传智",1024))
t3.invoke(person,"传智",1024);
}
注意事项:
小结:反射带参方法, 获取方法要带参,执行方法也要带参
四. 入门案例3:强制执行private带返回值的方法
代码实现:
/*
* 需求:在测试类中,调用Person类的t4方法 带返回值
* */
public static void main(String[] args) throws Exception {
//1、获取
//1.1、获取类 对象
Class> clazz = Class.forName("com.czxy.demo1.Person");
//1.2、通过类对象,获取方法
Method t3 = clazz.getDeclaredMethod("t4");
//1.3、设置类外可用 (暴力反射)
t3.setAccessible(true);
//2、执行 (相当于吃西瓜瓤)
//2.1、通过类对象,获取构造方法
Constructor> c = clazz.getConstructor();
//2.2、通过构造方法创建对象 (相当于 Person person = new Person();)
Object person = c.newInstance();
//2.3、调用方法 (相当于String str = person.t4();)
Object obj = t3.invoke(person);
//强转
String str = (String) obj;
System.out.println(str);
}
小结:
反射带返回值方法时,返回的都是Object类型,经过强转
五.入门总结
反射:针对性地获取 某个类中的任意成员方法/成员变量。
格式:
反射执行private方法步骤:(即使2.1和2.2紧跟在1.1之后,也是一种编写方式)
1、获取
1.1、获取类对象
1.2、获取类中方法
1.3、(private)设置类外可用-暴力反射
2、执行
2.1、获取类中构造方法
2.2、根据构造方法创建对象
2.3、调用方法
请给努力中的自己点个赞哦!
每天进步一点点`~~~~~