二〇二三-三-十七——反射

该文详细介绍了Java中的反射机制,包括通过Class.forName、.class及对象.getClass()的三种获取类的方式。接着讲解了如何获取构造方法,特别是对私有构造器的访问。此外,还阐述了如何设置访问权限以调用私有方法和字段,以及如何使用反射进行对象实例化和成员变量赋值。最后,提到了反射在处理方法调用时的角色,包括无参数和带参数的方法,尤其是对私有方法的调用。
摘要由CSDN通过智能技术生成

反射的三种实现方式

Class<?> aClass1 = Class.forname(model.StudentModel); //最常使用	括号里 全限定名 包名+类名 选中文件,ctrl + shift + alt + c 获取 
Class<?> aClass2 = Student.class;
Class<?> aClass3 = Student.getClass();

反射获取构造方法

无参

Constructor<?> constructor = aClass.getConstructor();

有参

Constructor<?> constructor1 = aClass.getConstructor(String.class, Integer.class);

私有有参

Constructor<?> constructor2 = aClass.getDeclaredConstructor(String.class);

私有方法的获取需要在 get 后加上 Declared

获取所有构造方法(返回一个数组)

Constructor<?>[] constructors = aClass.getConstructors();

通过反射获取的构造方法实例化对象

Object o = constructor.newInstance();
Object lisi = constructor1.newInstance("lisi", 22);

// 私有方法使用时需要设置 取消访问检查
constructor2.setAccessible(true);
Object zhangsan = constructor2.newInstance("zhangsan");

私有方法在使用前需要通过 方法实例化对象.setAccessible(true) 设置权限

反射获取成员变量(字段名)

// 公有
Field field = aClass.getField("address");
System.out.println(field);

// 私有
Field field1 = aClass.getDeclaredField("name");
System.out.println(field1);

私有字段的获取需要在 get 后加上 Declared

字段赋值

// 给反射的类的字段赋值
            Student stu = new Student();
            field.set(stu, "成都");

// 私有字段赋值需要设置权限
            field1.setAccessible(true);
            field1.set(stu,"王五");

私有字段在赋值前需要通过 方法实例化对象.setAccessible(true) 设置权限

反射获取成员属性(方法)

// 无参数方法
Method method = aClass.getMethod("study");

// 有参数私有方法
Method method1 = aClass.getDeclaredMethod("speak", String.class);

反射获取的方法使用

// 公有,无参
method.invoke(stu);
// 私有,有参
method1.setAccessible(true);
method1.invoke(stu,"立方");

反射所有代码需要在try……catch……中使用,捕获异常

Student 类的定义

package util;

public class Student {
    private String name;
    private Integer age;

    public String address;

    public Student() {
        System.out.println("无参构造");
    }

    public Student(String name, Integer age) {
        System.out.println("有参构造");
    }

    private Student(String name) {
        System.out.println("私有有参构造");
    }

    public void study(){
        System.out.println("类方法");
    }

    private void speak(String name){
        System.out.println("私有类方法");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值