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

news/2024/5/19 5:19:41 标签: java, 开发语言, 反射

在这里插入图片描述

反射出现的背景

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对象,并提供对数据库的增删改查操作。

http://www.niftyadmin.cn/n/4943359.html

相关文章

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题,感觉很爽。 现象: 背景:设备采用ARM,即rk3568处理器,采用Linux系统;主要用于视觉后端处理 现象:当软件运行一段时间,大概1个小时(也不是很固定…

【C++】面向对象编程引入 ( 面向过程编程 | 查看 iostream 依赖 | 面向对象编程 )

文章目录 一、面向过程编程二、查看 iostream 依赖三、面向对象编程 一、面向过程编程 给定 圆 的 半径 , 求该圆 的 周长 和 面积 ; 半径为 r r r , 周长就是 2 π r 2 \pi r 2πr , 面积是 π r 2 \pi r^2 πr2 ; 使用 面向过程 的方法解决上述问题 , 只能是令程序顺序执…

DMA技术

先总结: DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术 主要工作是由DMA控制器来完成的. 下面开始正文 ---------------------------------------------------------------------------- 1、DMA由来 DMA(Direct Memory Access,直接存储器访问)。在&#xf…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 893 (Div. 2) 目录 A. Buttons题目大意思路核心代码 B. The Walkway题目大意思路核心代码 C. Yet Another Permutation Problem题目大意思路核心代码 A. Buttons 题目大意 一共有三个盒子分别是a、b、c,第一个人只能拿a、c,第二个人只…

【ES6】—使用 const 声明

一、不属于顶层对象window 使用const关键字 声明的变量,不会挂载到window属性上 const a 5 console.log(a) console.log(window.a) // 5 // undefined二、不允许重复声明 使用const关键字不允许重复声明相同的变量 cosnt a 5 cosnt a 6 // Uncaught SyntaxEr…

react go实现用户历史登录列表页面

refer: http://ip-api.com/ 1.首先需要创建一个保存用户历史的登录的表,然后连接go 2.在用户登录的时候,获取用户的IP IP位置,在后端直接处理数据即可(不需要在前端传递数据) (1)增加路由&am…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件,然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同,但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

深入源码分析kubernetes informer机制(四)DeltaFIFO

[阅读指南] 这是该系列第四篇 基于kubernetes 1.27 stage版本 为了方便阅读,后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 client-go中的存储结构DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 总结 client-go中的存储结构…