Java 反射出现的背景和简单概述

在这里插入图片描述

反射出现的背景

Java程序中,所有的对象都有两种类型:编译时类型运行时类型,而很多时候对象的编译时类型和运行时类型不一致

编译时类型是指在编译时期确定的对象类型,它是根据声明时所使用的类型来确定的。编译时类型是在编译阶段静态确定的,它决定了我们在编写代码时可以使用哪些方法和字段。

运行时类型是指在程序运行时期确定的对象类型,它是根据实际创建的对象来确定的。运行时类型是在程序运行时动态确定的,并可以通过Java的反射机制获取。运行时类型决定了我们在运行时可以实际调用哪些方法和访问哪些字段。

public class Example {
    public static void main(String[] args) {
        Animal animal = new Cat(); // 编译时类型为Animal,运行时类型为Cat
        animal.eat(); // 编译时调用Animal的eat()方法,运行时调用Cat的eat()方法

        Cat cat = new Cat(); // 编译时类型和运行时类型都为Cat
        cat.eat(); // 编译时和运行时都调用Cat的eat()方法
    }
}

class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("Cat is eating");
    }
}

总结起来,编译时类型是根据声明时的类型确定的,决定了在编写代码时可以使用哪些方法和字段;而运行时类型是根据实际创建的对象确定的,决定了在运行时可以实际调用哪些方法和访问哪些字段。

由于编译时根本无法预知该对象和类的真实信息,程序只能依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

反射概述

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

反射相关的主要API:

java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器

反射的优点和作用:

  • 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力
  • 反射提供了一种灵活的方式来操作对象,可以绕过编译时的类型检查,调用私有方法和访问私有字段。
  • 反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,例如,Spring框架使用反射来实现依赖注入、AOP(面向切面编程)和动态代理等功能。JUnit测试框架使用反射来查找和执行测试方法。
  • 反射可以帮助实现ORM框架,ORM框架通过反射将数据库中的表映射为Java对象,并提供对数据库的增删改查操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽露风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值