JAVA反射机制

反射就是把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()读取私有的构造函数,读取完后还需要设置一下暴力反射才可以

  1. 反射类中所有的构造函数
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值