[Java开发之路]反射机制

简介:

简介

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

反射基础

反射提供了一种动态的功能,这种动态功能非常的强大。它主要体现在通过反射相关的API,就可以知道一个陌生的java类的所有信息,包括属性,方法,构造器等。而且元素完全可以在运行时动态的进行创建或调用,而不必在JVM运行时就进行确定。

反射原理

严格意义上说,java并不是动态语言,它并没有Perl和Python那样的灵活多变。但是,java的反射机制却让它显得动态起来。

一般情况下,如果想生成这个类的对象时,运行这个程序的JVM会确认这个类的Class对象是否已经加载。如果尚未加载,JVM会根据类名查找class文件,并将其载入,一旦这个类的Class对象被载入内存,它就可以被用来创建这个类的所有对象。

另外,对于一个未知类型的引用来说,通常会采用强制类型转换的形式得到开发者想要的类型引用,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。

在以上这两个过程中,Class类一直都在起作用。因为Class类实例包含的是一个Java类的全部信息,包括类名,方法,属性等。换句话说,也就是Class对象就是代表一个类的类。

Java用Class类来代表所有的类,方便了开发者掌控类信息。通过Class,开发者可以得到属性,方法,构造器,修饰符等信息。在动态的 获取这些信息以后,开发者就可以用该Class创建实例,调用任何方法,访问任何属性等操作,这些也是反射的主要用途。

反射机制相关的API主要集中在java.lang.reflect包下,开发者也就是利用该包下面的接口和类进行相关的反射开发的。大多数的框架,如struts,Hibernate,和Spring,都会频繁的使用反射API来完成他们的动态的功能。

反射是为了能够动态的加载一个类,动态的调用一个方法,动态的房屋内一个属性等动态要求而设计的。它的出发点就在于JVM会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下的API以达到各种动态需求。

class类含义与作用

Class类在反射机制中起到了非常关键的作用,它是开发者进行反射开发的入口。那应该如何获取一个类的Class对象呢?如何让一个类动态的加载到JVM中呢?

在前面的内容中,读者知道了Class是用来记录一个类的各种信息的,它伴随着类的加载而创建。那么,类会在什么时候加载到JVM中呢?概括的来说,一个普通的Java类,会在一下几种情况,被加载到JVM中。
(1)需要使用该类创建对象。如下代码就会导致Student类被加载到JVM中:

Student student  = new Student();

(2)访问该类的静态成员。

System.out.println(Student.count).

(3)使用Class类的静态forName()方法,动态的加载一个指定类名的类。如果类未找到,则抛出ClassNotFoundException异常。

class.forName("com.test.student");

不管通过社么样的形式,类一旦被加载进入JVM以后,就会为它创建一个Class类的实例对象。那么,开发者又该如何得到这个Class对象呢?概括来说,要得到一个类的Class对象,可以通过以下几种途径。

(1)Class的forName()方法的返回值就是Class类型,也就是动态导入类的Class对象的引用。
(2)每个类都会有一个名称为Class的静态属性,通过它也是可以获取到Class对象的。

class<Student> clazz = Student.class;

(3)object类中有一个名为getClass的成员方法,它返回的是对象运行时类的Class对象。因为onject类是所有类的父类,所以,所有的对象都可以使用该方法得到它运行时类的Class对象。

Student stu = new Student();
Class<Student> clazz = stu.getClass();

获取到Class对象以后,就可以通过调用它的一些成员方法获取它所代表的类的属性,方法,修饰符等信息,以及调用newInstance()方法来创建新的实例对象。

目录
相关文章
|
2月前
|
人工智能 缓存 安全
Java中的反射机制:深入探索与应用
Java反射机制是程序运行时动态获取类信息并操作类成员的特性,具备高度灵活性,但也伴随性能与安全风险。本文详解反射的基本用法、高级应用及最佳实践,助你掌握这一强大工具的正确使用方式。
128 0
|
2月前
|
安全 Java 领域建模
Java 17 探秘:不容错过的现代开发利器
Java 17 探秘:不容错过的现代开发利器
110 0
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
164 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
2月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
129 1
|
2月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
120 1
|
2月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
144 1
|
2月前
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
102 1
|
2月前
|
人工智能 前端开发 安全
Java开发不可不知的秘密:类加载器实现机制
类加载器是Java中负责动态加载类到JVM的组件,理解其工作原理对开发复杂应用至关重要。本文详解类加载过程、双亲委派模型及常见类加载器,并介绍自定义类加载器的实现与应用场景。
177 4
|
1月前
|
移动开发 Cloud Native 安全
Java:跨平台之魂,企业级开发的磐石
Java:跨平台之魂,企业级开发的磐石

热门文章

最新文章