news 2026/4/3 6:01:16

Java反射(简单详细且易懂,快速入门)收藏这篇就够了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java反射(简单详细且易懂,快速入门)收藏这篇就够了

目录

一、介绍反射

1.反射概述

2.反射主要应用场景

3.Class类

二、使用反射

1.获取Class类

2.Class类常用方法

3.示例代码

3.1 测试获取成员变量

3.2 测试获取成员方法

3.3 测试获取构造函数

3.4 通过反射创建对象

3.5 通过反射修改属性

3.6 通过反射调用方法


一、介绍反射

1.反射概述

Java反射是Java语言的一种特性,它允许程序在运行时自我检查并对内部成员进行操作。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。具体来说,反射机制允许在运行状态中

对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意方法和属性,并且能改变它的属性

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。其本质是JVM得到Class对象之后,再通过Class对象进行反编译,从而获取对象的各种信息。

2.反射主要应用场景

  • 在运行时判断任意一个对象所属的类;
  • 在运行时实例化任意一个类的对象;
  • 在运行时获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等;
  • 在运行时获取任意对象的属性,并且能改变对象的属性;
  • 在运行时调用任意对象的方法。

3.Class类

在Java编程语言中,Class类是一个特殊的类,它用于表示JVM运行时的类或接口的信息。你可以把它看作是一个普通的类,但它描述的是所有的类的公共特性。

每个类在Java中都对应着一个Class对象,这个对象保存了该类的结构信息,如类名、字段、方法等。换句话说,Class类是一个反射工具,能提供很多方法用于获取类的各种信息,比如获取类名、判断该类是否是一个接口还是普通类等等。

二、使用反射

1.获取Class类

  • Class.forName(“类的全路径”);
  • 类名.Class
  • 对象名.getClass();
  • 包装类.TYPE
  • Class类.getSuperClass();

下面附上示例代码:

package com.cqs.reflect_; public class ReflectTest1 { public static void main(String[] args) throws ClassNotFoundException { //方法1:通过 Class.forName("类的全路径");获取Class Class class1 = Class.forName("com.cqs.reflect_.Student"); //方法2:通过 类名.Class 获取Class Class class2 = Student.class; //方法3:通过 对象名.getClass(); 获取Class Student student = new Student("小明", "10001", 18); Class class3 = student.getClass(); //方法4:通过 包装类.TYPE 获取Class Class class4 = Integer.TYPE; //方法5:通过 Class类.getSuperClass(); 获取Class Class class5 = class4.getSuperclass(); } } class Student{ private String name; private String number; public String sex; public int age; public Student(String name, String number, int age) { this.name = name; this.number = number; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }

2.Class类常用方法

调用Class的方法一般会返回三个对象

  • Field对象:存放获取对象的成员变量属性
  • Method对象:存放获取对象的方法
  • Constructor对象:存放获取对象的构造方法

下面是Class类的一些常用方法

  • 获取成员变量

getFields()//获取所有公开的成员变量,包括继承变量

getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量

getField(变量名)//获取指定公共属性的Field对象

getDeclaredField(变量名)//获取指定包括私有,不包括继承的Field对象

  • 获取成员方法

getMethods()//获取所有可见的方法,包括继承的方法

getMethod(方法名,参数类型列表)//获取指定方法的Method对象
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
**getDeclaredMethod(方法名,int.class,String.class)//**获取指定包括私有,不包括继承的Method对象

  • 获取构造方法

getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)//获取指定包括私有,不包括继承的Constructor对象

  • 总结:

getXXXs()//获取公开的包括继承的XXX对象

getDeclaredXXXs()//获取包括私有,不包括继承的XXX对象

getXXX(xx)//获取指定xx的XXX对象(公开的)

getDeclaredXXX(xx)//获取指定xx的XXX对象(包括私有,不包括继承)

其中XXX表示Field/Method/Constructor三者之一

方法名get后如果接Declared可以获取私有属性或者方法

方法名最后如果有s可以获取所有的XXX对象

  • 其他方法

getInterfaces()//返回一个包含class对象的数组,存放该类或者接口实现的接口

newInstance()//使用无参构造创建一个类的实例

getName()//返回该类的完整名

3.示例代码

定义Students类

class Student{ private String name; private String number; public String sex; public int age; public Student(String name, String number, int age) { this.name = name; this.number = number; this.age = age; } public Student(String name){ this.name = name; } private Student(String name, String number){ this.name = name; this.number = number; } private void schooling(){ System.out.println("去上学"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", number='" + number + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } }
3.1 测试获取成员变量
package com.cqs.reflect_; import java.lang.reflect.Field; public class ReflectField { public static void main(String[] args) throws NoSuchFieldException { Class<Student> studentClass = Student.class; //测试getFields()函数 Field []studentFields = studentClass.getFields(); System.out.println("通过getFields获取Student类所有公开属性"); for (Field field:studentFields) { System.out.println("属性的类型为:"+field.getType()+"属性的名称为:"+field.getName()); } System.out.println();//换行 //测试getDeclaredFields()函数 Field []studentDeclaredFields = studentClass.getDeclaredFields(); System.out.println("通过getDeclaredFields获取Student类所有属性(包括私有,不包括继承)"); for (Field field :studentDeclaredFields) { System.out.println("属性的类型为:"+field.getType()+"\t属性的名称为:"+field.getName()); } System.out.println();//换行 //getField(String)函数 Field field = studentClass.getField("age"); System.out.println("通过getField(\"age\")获取公开属性age"); System.out.println("属性的类型为:"+field.getType()+"\t属性的名称为:"+field.getName()); System.out.println();//换行 //测试getDeclaredField(String)函数 Field DeclaredFiled = studentClass.getDeclaredField("name"); System.out.println("通过getDeclaredField(\"name\")获取私有属性name"); System.out.println("属性的类型为:"+DeclaredFiled.getType()+"\t属性的名称为:"+DeclaredFiled.getName()); } }

运行结果:

通过getFields获取Student类所有公开属性
属性的类型为:class java.lang.String属性的名称为:sex
属性的类型为:int属性的名称为:age

通过getDeclaredFields获取Student类所有属性(包括私有,不包括继承)
属性的类型为:class java.lang.String 属性的名称为:name
属性的类型为:class java.lang.String 属性的名称为:number
属性的类型为:class java.lang.String 属性的名称为:sex
属性的类型为:int 属性的名称为:age

通过getField(“age”)获取公开属性age
属性的类型为:int 属性的名称为:age

通过getDeclaredField(“name”)获取私有属性name
属性的类型为:int 属性的名称为:age

进程已结束,退出代码0

3.2 测试获取成员方法
package com.cqs.reflect_; import java.lang.reflect.Method; public class ReflectMethod { public static void main(String[] args) throws NoSuchMethodException { Class<Student> studentClass = Student.class; //测试getMethods()函数 Method[] methods = studentClass.getMethods(); System.out.println("通过getMethods()获取所有公开方法"); for (Method method : methods) { System.out.println(method.getName()); Class[] plts = method.getParameterTypes(); System.out.println("参数数量为:"+plts.length); for (Class p : plts) { System.out.println("参数类型为:"+p.getTypeName()); } } System.out.println();//换行 //测试getDeclaredMethods()函数 Method[] DeclaredMethods = studentClass.getDeclaredMethods(); System.out.println("通过getDeclaredMethods()获取所有方法(包括私有,不包括继承)"); for (Method method : DeclaredMethods) { System.out.println(method.getName()); Class[] plts = method.getParameterTypes(); System.out.println("参数数量为:"+plts.length); for (Class p : plts) { System.out.println("参数类型为:"+p.getTypeName()); } } System.out.println();//换行 //测试getMethod(参数)函数 Method method = studentClass.getMethod("setName", String.class); System.out.println("通过getMethod(\"getName\",String.class)获取getName方法"); System.out.println(method.getName()); Class[] plts = method.getParameterTypes(); System.out.println("参数数量为:"+plts.length); for (Class p : plts) { System.out.println("参数类型为:"+p.getTypeName()); } System.out.println();//换行 //测试getDeclaredMethod(参数)函数 Method DeclaredMethod = studentClass.getDeclaredMethod("schooling"); System.out.println("通过getDeclaredMethod(\"schooling\")获取schooling方法"); System.out.println(DeclaredMethod.getName()); Class[] pls = DeclaredMethod.getParameterTypes(); System.out.println("参数数量为:"+pls.length); for (Class p : pls) { System.out.println("参数类型为:"+p.getTypeName()); } } }

运行结果:

通过getMethods()获取所有公开方法
getNumber
参数数量为:0
getName
参数数量为:0
setName
参数数量为:1
参数类型为:java.lang.String
setNumber
参数数量为:1
参数类型为:java.lang.String
wait
参数数量为:0
wait
参数数量为:2
参数类型为:long
参数类型为:int
wait
参数数量为:1
参数类型为:long
equals
参数数量为:1
参数类型为:java.lang.Object
toString
参数数量为:0
hashCode
参数数量为:0
getClass
参数数量为:0
notify
参数数量为:0
notifyAll
参数数量为:0

通过getDeclaredMethods()获取所有方法(包括私有,不包括继承)
getNumber
参数数量为:0
getName
参数数量为:0
setName
参数数量为:1
参数类型为:java.lang.String
schooling
参数数量为:0
setNumber
参数数量为:1
参数类型为:java.lang.String

通过getMethod(“getName”,String.class)获取getName方法
setName
参数数量为:1
参数类型为:java.lang.String

通过getDeclaredMethod(“schooling”)获取schooling方法
schooling
参数数量为:0

3.3 测试获取构造函数

示例代码

package com.cqs.reflect_; import java.lang.reflect.Constructor; public class ReflectConstructor { public static void main(String[] args) { Class<Student> studentClass = Student.class; //测试getConstructors()函数 Constructor[] constructors = studentClass.getConstructors(); System.out.println("通过getConstructors()获取所有公开构造方法"); for (Constructor con: constructors) { System.out.println("构造方法名称为:"+con.getName()); Class plts[] = con.getParameterTypes(); System.out.println("参数数量为:"+plts.length); System.out.println("形参类型为:"); for (Class p: plts) { System.out.println(p); } } System.out.println();//换行 //测试getDeclaredConstructors()函数 Constructor[] DeclaredConstructors = studentClass.getDeclaredConstructors(); System.out.println("通过getDeclaredConstructors()获取所有构造方法(包括私有,包括继承)"); for (Constructor con : DeclaredConstructors) { System.out.println("构造方法名称为:"+con.getName()); Class[] plts = con.getParameterTypes(); System.out.println("参数数量为:"+plts.length); System.out.println("形参类型为:"); for (Class p: plts) { System.out.println(p); } } } }

运行结果

通过getConstructors()获取所有公开构造方法
构造方法名称为:com.cqs.reflect_.Student
参数数量为:3
形参类型为:
class java.lang.String
class java.lang.String
int
构造方法名称为:com.cqs.reflect_.Student
参数数量为:1
形参类型为:
class java.lang.String

通过getDeclaredConstructors()获取所有构造方法(包括私有,包括继承)
构造方法名称为:com.cqs.reflect_.Student
参数数量为:3
形参类型为:
class java.lang.String
class java.lang.String
int
构造方法名称为:com.cqs.reflect_.Student
参数数量为:1
形参类型为:
class java.lang.String
构造方法名称为:com.cqs.reflect_.Student
参数数量为:2
形参类型为:
class java.lang.String
class java.lang.String

3.4 通过反射创建对象
package com.cqs.reflect_; import java.lang.reflect.Constructor; public class Reflect_newInstance { public static void main(String[] args) throws Exception{ Class studentClass = Student.class; Constructor c = studentClass.getConstructor(String.class, String.class, int.class); Object obj = c.newInstance("小明","1001",18); System.out.println(obj); //等价于 Student s = new Student("小明", "1001", 10); System.out.println(s); } }

运行结果

Student{name=‘小明’, number=‘1001’, sex=‘null’, age=18}
Student{name=‘小明’, number=‘1001’, sex=‘null’, age=10}

3.5 通过反射修改属性
package com.cqs.reflect_; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Reflect_modifyAttribute { public static void main(String[] args) throws Exception{ //通过反射创建对象 Class studentClass = Student.class; Constructor c = studentClass.getConstructor(String.class, String.class, int.class); Object obj = c.newInstance("小明","1001",18); //通过属性名获取field对象 Field f = studentClass.getDeclaredField("name"); //取消属性访问权限控制 f.setAccessible(true); //获取更改前name的值 System.out.println("更改前:"+f.get(obj)); System.out.println(obj); f.set(obj,"小刚"); System.out.println("更改后:"+f.get(obj)); System.out.println(obj); } }

运行结果

更改前:小明
Student{name=‘小明’, number=‘1001’, sex=‘null’, age=18}
更改后:小刚
Student{name=‘小刚’, number=‘1001’, sex=‘null’, age=18}

3.6 通过反射调用方法
package com.cqs.reflect_; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Reflection_callMethod { public static void main(String[] args) throws Exception{ //通过反射创建对象 Class<Student> studentClass = Student.class; Constructor c = studentClass.getConstructor(String.class, String.class, int.class); Object obj = c.newInstance("小明","1001",18); //获取setName方法并调用 Method m1 = studentClass.getDeclaredMethod("setName", String.class); m1.invoke(obj,"小飞"); System.out.println(obj); //获取schooling方法 Method m2 = studentClass.getDeclaredMethod("schooling"); //因为schooling为私有方法,所以得取消权限访问控制 m2.setAccessible(true); m2.invoke(obj); } }

运行结果

去上学
Student{name=‘小飞’, number=‘1001’, sex=‘null’, age=18}

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 21:41:09

知识库关联设想:将IndexTTS 2.0与RAG系统结合增强表达

知识库关联设想&#xff1a;将IndexTTS 2.0与RAG系统结合增强表达 在当前智能交互日益深入的背景下&#xff0c;用户早已不满足于“答得对”的机器回复——他们期待的是“说得像人”、甚至“演得动人”的表达体验。尤其是在教育讲解、虚拟角色对话和内容创作等场景中&#xff0…

作者头像 李华
网站建设 2026/4/1 19:57:40

打造沉浸式体验:360度全景图像查看器完全指南

打造沉浸式体验&#xff1a;360度全景图像查看器完全指南 【免费下载链接】360-image-viewer A standalone panorama viewer with WebGL 项目地址: https://gitcode.com/gh_mirrors/36/360-image-viewer 想要为你的网站添加令人惊叹的360度全景图像展示功能吗&#xff1…

作者头像 李华
网站建设 2026/4/2 2:00:36

VR-Reversal:轻松实现3D VR视频到2D格式的完美转换

VR-Reversal&#xff1a;轻松实现3D VR视频到2D格式的完美转换 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_mirro…

作者头像 李华
网站建设 2026/4/2 0:41:49

天若离线语音识别:完全本地的语音转文字解决方案

天若离线语音识别&#xff1a;完全本地的语音转文字解决方案 【免费下载链接】wangfreexx-tianruoocr-cl-paddle 天若ocr开源版本的本地版&#xff0c;采用Chinese-lite和paddleocr识别框架 项目地址: https://gitcode.com/gh_mirrors/wa/wangfreexx-tianruoocr-cl-paddle …

作者头像 李华
网站建设 2026/4/3 4:07:59

中国行政区划五级联动数据MySQL部署终极指南

想要快速搭建完整的中国行政区划数据库吗&#xff1f;这套五级联动数据系统包含从省级到村级的所有行政区划信息&#xff0c;为地址选择组件、数据分析平台提供强大的数据支撑。本文将带你从零开始&#xff0c;用不到30分钟完成MySQL环境下的完整部署&#xff01;&#x1f680;…

作者头像 李华
网站建设 2026/4/1 19:49:30

情感迁移设想:将一段视频人物的情绪迁移到IndexTTS 2.0

情感迁移设想&#xff1a;将一段视频人物的情绪迁移到IndexTTS 2.0 在短视频创作中&#xff0c;你是否曾遇到这样的困境&#xff1f;画面中角色愤怒地拍桌而起&#xff0c;可配音却语气平淡&#xff0c;毫无张力&#xff1b;或是动画剪辑时旁白提前结束&#xff0c;留下几秒尴尬…

作者头像 李华