反射就是把java类中的各种成分映射成一个个的Java对象
Java中创建对象大概有这几种方式:
1、new关键字:最常见、最简单的创建对象的方式
2、Clone方法:调用一个对象的clone方法,JVM会创建一个新的对象,将前面的对象的内容全部拷贝进去
3、反序列化:当序列化和反序列化一个对象,JVM会给我们创建一个单独的对象
除了上边的三种还有另外一种方式,就是 “反射”
-
概念:
反射就是把Java类中的各个部分,映射成一个个的Java对象,拿到这些对象后可以做一些事情。
例如,一个类有:成员变量,方法,构造方法,等信息,利用反射技术可以把这些组成部分映射成一个个对象。 -
如何得到想反射的类:
java中写的代码是存储在后缀名是 .java的文件里的,但是它会被编译,最终真正去执行的是编译后的 .class文件。Java是面向对象的语言,一切皆对象,所以java认为 这些编译后的 class文件,这种事物也是一种对象,它也给抽象成了一种类,这个类就是Class
反射的实现:
得到类的字节码的几种方式
(1)、Class.forName(“com.cj.test.Person”); 这就是上边我们用的方式
(2)、对象.getClass();
(3)、类名.class;
新建一个用于反射的类
public class Fanshe {
public Fanshe() {
System.out.println("无参构造方法");
}
public Fanshe(int i) {
System.out.println("一个参");
}
public Fanshe(int i, int j) {
System.out.println("两个参");
}
private Fanshe(String i) {
System.out.println(i + "一个参");
}
}
import org.junit.Test;
import java.lang.reflect.Constructor;
public class Demo1 {
@Test
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe"); //1
Constructor cc = clazz.getConstructor();
cc.newInstance();
}
}
1. 反射无参构造函数
2. 反射一个参数的构造函数
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe"); //1
Constructor cc = clazz.getConstructor(int.class);
cc.newInstance(1);
}
3. 反射多个参数
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe"); //1
Constructor cc = clazz.getConstructor(int.class, int.class);
cc.newInstance(1,2);
}
4. 访问私有构造函数
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe"); //1
Constructor cc = clazz.getDeclaredConstructor(String.class);
cc.setAccessible(true); //暴力反射c
cc.newInstance("测试");
}
在反射私有的构造函数时,用普通的clazz.getConstructor()会报错,因为它是私有的,需要用专门反射私有构造函数的方法 clazz.getDeclaredConstructor()读取私有的构造函数,读取完后还需要设置一下暴力反射才可以
- 反射类中所有的构造函数
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe"); //1
Constructor[] cc = clazz.getDeclaredConstructors();
for(Constructor c : cc){
System.out.println(c);
}
}
6. 反射类中的方法
public class Fanshe {
public Fanshe() {
System.out.println("无参构造方法");
}
public Fanshe(int i) {
System.out.println("一个参");
}
public Fanshe(int i, int j) {
System.out.println("两个参");
}
private Fanshe(String i) {
System.out.println(i + "一个参");
}
public void test1(){
System.out.println("测试方法1");
}
public void test2(String s){
System.out.println(s + "测试方法2");
}
}
public void test1() throws Exception {
Class clazz = Class.forName("Fanshe");
Fanshe fs = (Fanshe) clazz.newInstance();
Method m = clazz.getMethod("test1", null);
m.invoke(fs, null);
}
public void test2() throws Exception {
Class clazz = Class.forName("Fanshe");
Fanshe fs = (Fanshe) clazz.newInstance();
Method m = clazz.getMethod("test2", String.class);
m.invoke(fs, "测试");
}
7. 反射类中的属性字段
public class Fanshe {
public String name = "陈清纯";
public void test3(){
System.out.println("姓名:" + name);
}
}
public void test3() throws Exception {
Class clazz = Class.forName("Fanshe");
Fanshe fs = (Fanshe) clazz.newInstance();
Field field = clazz.getField("name");
System.out.println(fs.name);
field.set(fs, "美女");
System.out.println(fs.name);
}
参考:https://blog.youkuaiyun.com/ju_362204801/article/details/90578678