反射入门

一. 引言&概述

为了能够更加灵活地访问类中的所有内容(包含private),我们就需要反射技术

java反射能用线程跑吗 java反射编程_创建对象

反射:针对性地映射 某一个完整事物的行为或特征(单独操作类中任意内容 的超能力)

针对性地获取  某一个类的成员方法/成员变量

java反射能用线程跑吗 java反射编程_构造方法_02

灵活地使用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);
}

注意事项:

java反射能用线程跑吗 java反射编程_java反射能用线程跑吗_03

技巧:获取全类名

java反射能用线程跑吗 java反射编程_java编程 反射_04

小结:

反射:针对性获取 某个类中的所有成员方法/成员变量

反射步骤:

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);
}

注意事项:

java反射能用线程跑吗 java反射编程_类对象_05

小结:反射带参方法,  获取方法要带参,执行方法也要带参

四. 入门案例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、调用方法

请给努力中的自己点个赞哦!

每天进步一点点`~~~~~