Java中的反射

本文详细介绍了Java反射的概念,包括如何获取类的成员变量、构造方法和成员方法,并展示了如何使用反射进行操作,如设置和获取成员变量的值,创建对象,调用方法。反射在框架设计中起到关键作用,它可以解耦代码,提高程序的可扩展性。同时,文章还通过实例演示了反射的使用,包括获取和修改私有成员、调用构造函数和执行方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射

反射:框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射概念:将类的各个组成部分封装为其他对象,这就是反射机制

反射用一个 数组来存储 加载的类的成员变量、构造方法、成员方法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

反射的好处:

  1. 可以在程序运行过程中,操作这些对象。

  2. 可以解耦,提高程序的可扩展性。

    获取成员变量

    Field[ ] getFields( ) 获取所有public修饰的成员变量
    Field getFields(String name) 获取指定的public修饰的成员变量
    Fied[ ] getDeclaredFieds( ) 获取所有的成员变量 不考虑修饰符

    获取到成员变量后,可以执行的操作为: 设置值 void set(Object obj,Object value)和获取值

    反射破坏了封装,可以直接设置值

    setAccessible(true); //暴力反射 忽略安全检查

获取构造方法

​ 用来创建对象
​ T newInstance(Object …initargs)

获取成员方法

​ getMethod 获得指定方法
​ Method 对象 执行方法 Object invoke(Object obj,Object … args)
​ 获取方法名称 getName( )

获取Class对象的方式

1.Class.forName(“全类名”); 将字节码文件加载进内存,返回Class对象
2.加载进内存的类,可通过 类名,class 通过类名的属性获取
3.创建对象时,对象,getClass( ) 这个方法封装在Object类里面

public class fanshe {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        //获取Person的Class对象
        Class personClass = Person.class;

        //获取成员变量
        Field fields = personClass.getField("school");
        System.out.println(fields);

        //获取成员变量的值
        Person p = new Person();
        Object value = fields.get(p);
        System.out.println(value);

        System.out.println("=================================");

        //设置成员变量的值
        fields.set(p,"南阳理工");
        System.out.println(p);

        System.out.println("=================================");

        //获取所有成员变量的值
        Field[] fields1 = personClass.getDeclaredFields();
        for (Field d : fields1){
            System.out.print(d+"||");
        }

        System.out.println("\n======================================");

        Field d = personClass.getDeclaredField("name");
        //忽略访问权限修饰符的安全检查
        d.setAccessible(true); //暴力反射
        Object value2 = d.get(p);
        System.out.println(value2);

        System.out.println("=================================");

        //构造方法
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);

        System.out.println("=================================");

        //创建对象
        Object o = constructor.newInstance("保罗·乔治", 31);
        System.out.println(o);

        System.out.println("=================================");

        //获取成员方法
        Method method_eat = personClass.getDeclaredMethod("eat");
        method_eat.invoke(p);

        Method method_eat2 = personClass.getDeclaredMethod("eat", String.class);
        method_eat2.invoke(p,"热干面");

        System.out.println("=================================");

    }
}
public class Person {
    private String name;
    private int age;
    public String school;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school='" + school + '\'' +
                '}';
    }

    public void eat(){
        System.out.println("开饭了!!!");
    }

    public void eat(String food){
        System.out.println("开饭了!!! 今天吃"+food);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值