Java反射机制(简单易懂)

article/2025/10/30 16:03:41

文章目录

  • 前言
  • 一、反射机制
  • 二、反射的用途
  • 三、反射相关的类(重要)
    • 3.1 Class类(反射机制的起源 )
    • 3.2 通过反射调用构造方法
    • 3.3 通过反射调用普通方法
    • 3.4 通过反射调用类属性
  • 四、反射的优缺点
  • 总结


前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

一、反射机制

反射:在JVM运行时,一切框架的基础。

对于JVM中任何一个类,都能动态获取该类的所有属性和方法。

对于JVM中的任何一个对象,都能动态调用该对象的属性和方法。

动态获取信息以及调用对象机制称为反射机制

二、反射的用途

1、在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法
2、反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

拓展:

Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)编译时类型,例如Person p = new Student();这句代码中p在编译时类型为Person,运行时类型为Student。程序需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。

运行时明确该引用到底是啥类型就可以通过反射机制。

三、反射相关的类(重要)

在这里插入图片描述

这些类都在java.lang.reflect包下面。

1.Class类: 反射核心类,使用class关键字,包括数组,包括接口编译后生成的class文件就对应一个唯一的class对象,由JVM产生,使用这个class对象就可以获取该类的所有信息。

例如定义如下一个学生类:

class Student{int age;String name;
}

执行 javac Student.java 后 => Student.class

将JVM启动之后,Student类被加载到JVM之后就会产生一个全局唯一的Student.class对象,由JVM产生,就根据这个对象来反射操作Student类

2.Field类:反射调用类中的成员/类属性

3.Method类:反射调用类中的成员/类方法

4.Constructor类:反射调用构造方法

3.1 Class类(反射机制的起源 )

Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为一个对象,这个对象就是 java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类成为一个动态的类 .

无论要通过反射机制干啥事情,首先第一步就是获取该类的class对象(由JVM产生的,全局唯一)

三种方式:

  1. 调用Class.forName(类的全名称) 【包名.类名】
  2. 调用类名称.class 【属性】
  3. 通过该类的任意对象的getClass()

在这里插入图片描述

3.2 通过反射调用构造方法

在这里插入图片描述

普通的get只能获取public权限的方法或者属性,getDeclared…()可以获取所有权限的方法或属性

在这里插入图片描述

示例:

   // 1.获取所有public权限的构造方法Constructor[] constructors = cls.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}System.out.println("------------------------------");// 获取该类所有构造方法Constructor[] constructors1 = cls.getDeclaredConstructors();for (Constructor constructor : constructors1) {System.out.println(constructor);}

破坏封装产生对象:

// 破坏封装,通过反射破坏private封装,调用私有构造方法
constructor.setAccessible(true);
Student student = constructor.newInstance("Killing Vibe");
System.out.println(student);

3.3 通过反射调用普通方法

在这里插入图片描述

invoke方法:

在这里插入图片描述
示例:

假设已经获取了Student类的反射对象cls,Student类中有一个test方法

 //2.获取要调用方法的Method对象Method method1 = cls.getDeclaredMethod("test");// test是静态方法,无需产生Student对象method1.invoke(null);Method method2 = cls.getDeclaredMethod("fun",String.class);Student student = new Student("VIBE","男",18);method2.invoke(student,"传入的参数");

3.4 通过反射调用类属性

在这里插入图片描述

Field.get()方法 : 通过obj对象获取相关属性的值,属性为静态属性,则传入null

Field.set()方法:通过obj对象修改相关属性的值,若为静态对象,则传入null

示例:

假设已经获取了Student类的反射对象cls,Student类中有country,age属性

   // 3.获取要拿到的属性Field对象Field field = cls.getDeclaredField("country");System.out.println(field.get(null));Field field1 = cls.getDeclaredField("age");Student student = new Student("VIBE","男",18);System.out.println(field1.get(student));field1.set(student,20);System.out.println(field1.get(student));

运行如下:

在这里插入图片描述

四、反射的优缺点

优点:

  1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
  2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
  3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺点

  1. 使用反射会有效率问题。会导致程序效率降低。
  2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。

总结

以上就是Java反射机制的原理以及相关类和代码实现,如果有什么疑问或者需要完整代码可以私信博主~~感谢支持


http://chatgpt.dhexx.cn/article/nWWukZVJ.shtml

相关文章

Java反射机制详解

文章目录 1.反射1.1 反射的概述为什么需要反射? 1.2 获取Class类对象的三种方式1.2.1 代码示例 1.3 反射获取构造方法并应用1.3.1 Class类获取构造方法对象的方法1.3.2 代码示例1.3.3 Constructor类用于创建对象的方法1.3.4 代码示例1.3.5 小结 1.4 反射获取成员变量…

Java反射机制

Java反射机制 前言一、反射的概述反射的定义反射的作用 反射的应用场合 二、Java反射机制反射机制原理示意图Java Reflection反射使用步骤 三、 Class类基本介绍常用方法获取Class类对象对象实例化的方式通过反射获取类的相关信息 四、类加载基本说明类加载时机类加载过程图类加…

JAVA反射机制及其原理实现

9.1 概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;public、protected、private。 OO(面向对象)&#xf…

day17-基础加强(类加载器和反射)

1.类加载器 1.1类加载器【理解】 作用 负责将.class文件(存储的物理文件)加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例(对象)调用类的类方法访问类或者接口的类变量,或者为该类变量赋值使用反射…

Java-反射机制(超详解)

Java反射机制概述 前言一、Java反射机制概述1. Java Reflection2. 动态语言 vs 静态语言 二、 Class类的理解1. 类的加载过程1.1 初步了解1.2 类的加载过程图解1.3 了解:什么时候会发生类初始化?1.4 类加载器的作用1.5 JVM中不同类型的类的加载器1.6 代码…

Java--反射机制原理、几种Class获取方式及应用场景

目录 📢学习背景🎹一、Java反射机制是什么?🎸1.1 反射原理📣1.2 反射例子 🎵二、Java反射机制中获取Class的三种方式及区别?📀2.1 Class的几种获取方式🔊2.2 代码演示几种…

关于线程和进程的区别

进程 : 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程 线程: 进程中的一个执行任务(控制单元)&…

从内核角度看Linux 线程和进程的区别

多数人都会讲说线程和进程在内核中是相同的,没有严格地做区分。这样讲是没错了,但对于应用开发者来说,这样讲是有点笼统。本文将从内核角度,分析线程和进程之间的区别,希望能对这一块感兴趣的人提供借鉴意义。 1 数据…

java线程与进程的区别是什么?

关于进程与线程的文章早已是非常多了,本文是对我个人过往学习,理解及应用进程与线程的一个总结。此文内容涉及进程线程的区别,什么是进程,什么是线程?希望对大家有所帮助。 java线程与进程的区别是什么? 进程:是并…

Java面试--线程和进程的区别

面试题:线程和进程的区别是什么(招银网络科技、阿里巴巴面试题) 一、线程和进程的区别是什么? 1、进程是一段正在执行的程序,是资源分配的基本单元,而线程是CPU调度的基本单元。 2、进程间相互独立进程&a…

对线程与进程的区别以及对多线程并发的理解

一、线程与进程的区别 先简单说说线程与进程的概念: (1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程。 (2)线程是指进程中的一个执行流程。 区别&…

线程与进程的区别和处理器的调度

(1)进程的概念(Dijkstra) 进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位。 (2)进程与程序的联系与区别 ① 程序是指令的有序集合&#x…

多线程(一)线程和进程的区别

目录 🍓 一,进程线和程的概念🍌二,为什么要有线程(1)首先并发编程成为需求(2)虽然进程也可以并编程,但是线程更轻量(3)那么是不是线程创建越多越好…

线程和进程的区别是什么?(2021最新)

首先用一句话概括线程和进程的区别是:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。是运行中的程序指令的一种描述,这需要与程序中的代码区别开来。 做个简单的比喻:进程火车,线程车厢 线程在进程下行进&…

线程和进程的区别和联系

操作系统任何处理线程 1.先描述一个进程(明确出一个进程上面的一些相关的属性) 操作系统里面主要是通过c/c来实现的,此处的描述其实就是用的c语言中的"结构体"(操作系统中描述进程的这个结构体称为"PCB"(process control block)进程控制块。 2.再组…

进程和线程有什么区别?

从用户的角度来看,进程是正在运行的程序实例,而线程是进程中真正执行任务的基本单位。也就是说一个运行的程序至少包含一个进程,一个进程至少包含一个线程,线程不能独立于进程而存在。 进程 进程(Process&#xff09…

线程和进程有什么区别(简单介绍)

线程和进程有什么区别(简单介绍) 简单介绍 一、线程的基本概念 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可…

线程和进程的区别是什么?

本文转载自知乎 文章目录 1.进程和线程的定义2.二者的区别(解释1)3.两者的区别(解释2) 1.进程和线程的定义 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是…

线程和进程的区别

1、线程和进程的区别 进程:是指一个内存中运行的应用程序(已经在内存中运行的程序). 一个进程都有一个独立的内存空间,一个电脑(手机)可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位; 线…

线程与进程,你真得理解了吗

线程与进程,你真得理解了吗 1 进程与线程的关系和区别2 并行与并发3 线程共享了进程哪些资源 相信大家面试时一定没少被一个问题刁难,那就是进程和线程的区别是什么?这个问题延申开来并不像表面那么简单,今天就来深入一探。 开始…