1. 反射
1.1 反射是什么?
反射就是把 Java 类中的各个部分,映射成一个个的 Java 对象,拿到这些对象后可以做一些事情
。
既然说反射是 Java 类中的各个组成部分,所以说咱们得知道一个类中有哪儿些部分?
例如,一个类有:成员变量,方法,构造方法
等信息,利用反射技术咱们可以把这些组成部分映射成一个个对象。
1.2 反射能干什么?
- 拿到映射后的构造方法,可以用它来生成对象;
- 拿到映射后的方法,可以调用它来执行对应的方法;
- 拿到映射后的字段,可以用它来获取或改变对应字段的值;
一般来说反射是用来做框架的,或者说可以做一些抽象度比较高的底层代码,反射在日常的开发中用到的不多,但是咱们还必须搞懂它,因为搞懂了反射以后,可以帮助咱们理解框架的一些原理。
所以说有一句很经典的话:反射是框架设计的灵魂。现在说完这个可能还不太能理解,不急,等下说完一个快速入门的例子后,应该会稍微有点感觉
1.3 怎么得到想反射的类
刚才已经说过,反射是对一个类进行解剖,想解剖一个东西,前提是首先你得拿到这个东西,那么怎么得到咱们想解剖的类呢?
首先大家要明白一点,咱们写的代码是存储在后缀名是 .java
的文件里的,但是它会被编译,最终真正去执行的是编译后的 .class
文件。
Java是面向对象的语言,一切皆对象,所以java认为 这些编译后的 class文件,这种事物也是一种对象,它也给抽象成了一种类,这个类就是Class,在Class类中,有一个方法forName(String className); 而且是一个静态的方法,这样咱们就可以得到想反射的类了
到这里,看Class clazz = Class.forName(“com.cj.test.Person”);这个应该有点感觉了吧
Class.forName(“com.cj.test.Person”);因为这个方法里接收的是个字符串,字符串的话,我们就可以写在配置文件里,然后利用反射生成我们需要的对象,这才是我们想要的。很多框架里都有类似的配置
1.4 反射中常用的方法
反射无参的构造函数
可以看到 默认的无参构造方法执行了
从上边的例子看出,要想反射,首先第一步就是得到类的字节码
所以简单说一下得到类的字节码的几种方式
(1)、Class.forName(“com.cj.test.Person”); 这就是上边我们用的方式
(2)、对象.getClass();
(3)、类名.class;
反射“一个参数”的构造函数
反射“多个参数”的构造函数
反射“私有”的构造函数
这就是反射的厉害之处,在别的类中,都可以调用想要获取的类的私有方法
注意:在反射私有的构造函数时,用普通的clazz.getConstructor()会报错,因为它是私有的,所以提供了专门反射私有构造函数的方法
clazz.getDeclaredConstructor(int.class);//读取私有的构造函数,用这个方法读取完还需要设置一下暴力反射才可以
c.setAccessible(true);//暴力反射
反射得到类中所有的构造函数
反射类中的方法
下面是Person类以及其方法
package com.cj.test;
import java.util.Date;
public class Person {
public Person(){
System.out.println("默认的无参构造方法执行了");
}
public Person(String name){
System.out.println("姓名:"+name);
}
public Person(String name,int age){
System.out.println(name+"="+age);
}
private Person(int age){
System.out.println("年龄:"+age);
}
public void m1() {
System.out.println("m1");
}
public void m2(String name) {
System.out.println(name);
}
public String m3(String name,int age) {
System.out.println