2026/4/18 10:30:59
网站建设
项目流程
网站查询域名解析ip,wordpress 表格主题,单位门户网站功能,软件开发文档国家标准目录
一、介绍反射
1.反射概述
2.反射主要应用场景
3.Class类
二、使用反射
1.获取Class类
2.Class类常用方法
3.示例代码
3.1 测试获取成员变量
3.2 测试获取成员方法
3.3 测试获取构造函数
3.4 通过反射创建对象
3.5 通过反射修改属性
3.6 通过反射调用方法 一…目录一、介绍反射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();包装类.TYPEClass类.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 { ClassStudent 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进程已结束,退出代码03.2 测试获取成员方法package com.cqs.reflect_; import java.lang.reflect.Method; public class ReflectMethod { public static void main(String[] args) throws NoSuchMethodException { ClassStudent 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参数数量为0getName参数数量为0setName参数数量为1参数类型为:java.lang.StringsetNumber参数数量为1参数类型为:java.lang.Stringwait参数数量为0wait参数数量为2参数类型为:long参数类型为:intwait参数数量为1参数类型为:longequals参数数量为1参数类型为:java.lang.ObjecttoString参数数量为0hashCode参数数量为0getClass参数数量为0notify参数数量为0notifyAll参数数量为0通过getDeclaredMethods()获取所有方法(包括私有,不包括继承)getNumber参数数量为0getName参数数量为0setName参数数量为1参数类型为:java.lang.Stringschooling参数数量为0setNumber参数数量为1参数类型为:java.lang.String通过getMethod(“getName”,String.class)获取getName方法setName参数数量为1参数类型为:java.lang.String通过getDeclaredMethod(“schooling”)获取schooling方法schooling参数数量为03.3 测试获取构造函数示例代码package com.cqs.reflect_; import java.lang.reflect.Constructor; public class ReflectConstructor { public static void main(String[] args) { ClassStudent 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.Stringclass java.lang.Stringint构造方法名称为com.cqs.reflect_.Student参数数量为1形参类型为:class java.lang.String通过getDeclaredConstructors()获取所有构造方法(包括私有,包括继承)构造方法名称为com.cqs.reflect_.Student参数数量为3形参类型为:class java.lang.Stringclass java.lang.Stringint构造方法名称为com.cqs.reflect_.Student参数数量为1形参类型为:class java.lang.String构造方法名称为com.cqs.reflect_.Student参数数量为2形参类型为:class java.lang.Stringclass java.lang.String3.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’, age18}Student{name‘小明’, number‘1001’, sex‘null’, age10}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’, age18}更改后:小刚Student{name‘小刚’, number‘1001’, sex‘null’, age18}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{ //通过反射创建对象 ClassStudent 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’, age18}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大模型学习资源包》免费分享