news 2026/2/17 15:34:48

Java--Stream流详解,零基础入门到精通,收藏这篇就够了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java--Stream流详解,零基础入门到精通,收藏这篇就够了

目录

一、什么是反射?

二、反射的用途

三、获取Class对象

四、Class类型的对象使用场景1

五、Class类型的对象使用场景2

六、通过反射创建对象

七、使用 Java 反射机制获取和调用类的构造方法,访问私有构造方法并创建对象

八、通过反射,访问并使用成员方法

九、通过反射,调用静态方法以及处理可变参数

十、反射的性能问题

十一、反射的安全性

十二、反射的常见场景


一、什么是反射?
**反射**(Reflection)是一种 Java 程序**运行期间**的**动态**技术,可以在**运行时**(runtime)检査、修改其自身结构或行为。通过反射,程序可以访问、检测和修改它自己的类、对象、方法、属性等成员
二、反射的用途
  • 动态加载类:程序可以在运行时动态地加载类库中的类;

  • 动态创建对象:反射可以基于类的信息,程序可以在运行时,动态创建对象实例;

  • 调用方法:反射可以根据方法名称,程序可以在运行时,动态地调用对象的方法(即使方法在编写程序时还没有定义)

  • 访问成员变量:反射可以根据成员变量名称,程序可以在运行时,访问和修改成员变量(反射可以访问私有成员变量)

  • 运行时类型信息:反射允许程序在运行时,查询对象的类型信息,这对于编写通用的代码和库非常有用;

    Spring 框架使用反射来自动装配组件,实现依赖注入; MyBatis 框架使用反射来创建resultType 对象,封装数据查询结果;
三、获取Class对象
反射的第一步是获取 `Class` 对象。`Class` 对象表示某个类的元数据,可以通过以下几种方式获取:
//获取Class类型信息 public class Text02 { public static void main(String[] args) throws ClassNotFoundException { //方式1:通过类名 Class stringClass1 = String.class; //方式2:通过Class类的forName()方法 Class stringClass2 = Class.forName("java.lang.String"); //方式3:通过对象调用getClass()方法 Class stringClass3 = "".getClass(); System.out.println(stringClass1.hashCode());//1604839423 System.out.println(stringClass2.hashCode());//1604839423 System.out.println(stringClass3.hashCode());//1604839423 } }
四、Class类型的对象使用场景1
将一个 JSON 字符串解析为 Java 对象,并输出该对象的字段值。
//Class类型的对象使用场景1 public class Text03 { public static void main(String[] args) { String json= "{\"name\":\"长安荔枝\",\"favCount\":234}"; //方法定义 Document doc=JSON.parseObject(json,Document.class); System.out.println(doc.getName()); System.out.println(doc.getFavCount()); } }
使用 `JSON.parseObject` 方法将 JSON 字符串解析为 `Document` 类的对象。在解析过程中,JSON 字符串中的数据会自动映射到 `Document` 类的对应字段中。
五、Class类型的对象使用场景2
通过 `Class` 对象在运行时获取一个类的相关信息,包括类名、包名、成员变量(字段)、成员方法等。
//Class类型的对象使用场景2 //获取丰富的类型内容 public class Text04 { public static void main(String[] args) throws ClassNotFoundException { Class clz = Class.forName("java.util.HashMap"); //获取类名 System.out.println("完全限定名:"+clz.getName()); System.out.println("简单的类名:"+clz.getSimpleName()); //获取包名 System.out.println("package"+clz.getPackage().getName()); System.out.println(); //获取成员变量 Field[] fieldArray =clz.getDeclaredFields(); System.out.println("成员变量(字段)"); for(Field field:fieldArray) { System.out.println(field); } System.out.println(); //获取成员方法 Method[] methodArray = clz.getDeclaredMethods(); System.out.println("成员方法"); for(Method method:methodArray) { System.out.println(method); } } }
  • clz.getName()返回类的完全限定名,包括包名,例如"java.util.HashMap"
  • clz.getSimpleName()返回类的简单名称,不包括包名,例如"HashMap"
  • clz.getPackage().getName()返回类所属的包名,例如"java.util"
  • clz.getDeclaredFields()返回一个Field数组,包含了类声明的所有字段(包括私有字段)。
  • clz.getDeclaredMethods()返回一个Method数组,包含了类声明的所有方法(包括私有方法)。
六、通过反射创建对象

方式一:通过Class对象直接调用newInstance()方法

方式二:通过获取构造方法(Constructor)来创建对象。

//通过反射的方式,创建对象 public class Text05 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { Class clz = Class.forName("com.apesource.demo01.Document"); //方式1:直接通过Class对象,调用newInstance()方法 Object objx = clz.newInstance();//相当于在执行无参构造方法 //方式2:通过构造器(构造方法) //无参构造方法 Constructor constructor1 = clz.getDeclaredConstructor();//获取无参构造方法 System.out.println(constructor1); Object obj1 = constructor1.newInstance();//执行构造器(构造方法),创建对象 //有参构造方法 Constructor constructor2 = clz.getDeclaredConstructor(String.class);//获取有参构造方法 System.out.println(constructor2); Object obj2 = constructor2.newInstance("两京十五日"); Constructor constructor3 = clz.getDeclaredConstructor(int.class);//获取有参构造方法 System.out.println(constructor3); Object obj3 = constructor3.newInstance(34); Constructor constructor4 = clz.getDeclaredConstructor(String.class,int.class);//获取有参构造方法 System.out.println(constructor4); Object obj4 = constructor4.newInstance("风起陇西",64); System.out.println(objx); System.out.println(obj1); System.out.println(obj2); System.out.println(obj3); System.out.println(obj4); }
  • newInstance()方法是Class对象提供的一个方法,它调用类的无参构造方法来创建类的实例。
  • 注意:这个方法在 Java 9 以后已经被弃用,推荐使用Constructor对象来创建实例。
  • 通过getDeclaredConstructor()方法获取Document类的无参构造方法,然后调用newInstance()方法创建实例。
  • 注意:如果类中没有无参构造方法,调用getDeclaredConstructor()会抛出NoSuchMethodException
  • 通过getDeclaredConstructor(String.class)获取带有一个String参数的构造方法,并传入"两京十五日"作为参数来创建对象。
  • 通过getDeclaredConstructor(int.class)获取带有一个int参数的构造方法,并传入34作为参数来创建对象。
七、使用 Java 反射机制获取和调用类的构造方法,访问私有构造方法并创建对象
public class Text06 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class clz = Class.forName("com.apesource.demo01.Document"); //获取一组构造器 Constructor[] constructorArray1 = clz.getConstructors();//public Constructor[] constructorArray2 = clz.getDeclaredConstructors();//public、private //获取指定构造器 Constructor constructor1 = clz.getConstructor(); Constructor constructor2 = clz.getDeclaredConstructor(String.class); System.out.println(constructor1); System.out.println(constructor2); //调用私有构造器,必须设置它的访问全限 constructor2.setAccessible(true); //调用构造器,创建对象 Object obj = constructor2.newInstance("长安三万里"); System.out.println(obj); } }
  • getConstructors()方法返回一个包含所有公共(public)构造方法的数组。如果类中没有public构造方法,则返回空数组。
  • getDeclaredConstructors()方法返回一个包含所有声明的构造方法的数组(包括私有的、受保护的和默认访问级别的构造方法)。
  • getConstructor()方法用于获取类的无参构造方法(必须是public的)。如果没有无参构造方法或者不是public,则抛出NoSuchMethodException
  • getDeclaredConstructor(Class<?>... parameterTypes)方法用于获取指定参数类型的构造方法。这里通过传入String.class参数获取一个带有String参数的构造方法。这个构造方法可以是任何访问级别(publicprivateprotected、默认)。
  • setAccessible(true)用于绕过 Java 访问控制机制,使私有构造方法也可以被调用。如果不设置Accessibletrue,那么调用私有构造方法时会抛出IllegalAccessException
  • newInstance(Object... initargs)方法使用指定的构造方法创建对象。这里调用了带有String参数的构造方法,并传入"长安三万里"作为参数。
八、通过反射,访问并使用成员方法
public class Text08 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { //硬编码的方式 // Document doc1 = new Document(); // doc1.setName("海底两万里"); // doc1.setFavCount(10025); //反射的方式 Class clz = Class.forName("com.apesource.demo01.Document");//获取类型信息 Object doc1 = clz.newInstance();//创建对象 //获取指定名称和参数类型的方法 Method setNameMethod = clz.getMethod("setName", String.class); Method setFavCountMethod = clz.getMethod("setFavCount", int.class); //执行方法 //doc1.setName("海底两万里"); setNameMethod.invoke(doc1, "海底两万里"); //doc1.setFavCount(10025); setFavCountMethod.invoke(doc1, 10025); System.out.println(doc1); } }
  • getMethod(String name, Class<?>... parameterTypes)方法用于获取类的某个public方法。方法名称和参数类型必须匹配才能成功获取方法。
  • invoke(Object obj, Object... args)方法用于调用指定的实例方法。
  • setNameMethod.invoke(doc1, "海底两万里");等同于doc1.setName("海底两万里");
  • setFavCountMethod.invoke(doc1, 10025);等同于doc1.setFavCount(10025);
九、通过反射,调用静态方法以及处理可变参数
public class Text09_01 { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException { //硬编码的方式 //调用静态方法 // Document.dosth(); String ret1 = String.format("HashMap的默认初始容量是%d,加载因子是%.2f", 16,0.75f); System.out.println(ret1); //反射的方式 // Class clz = Class.forName("com.apesource.demo01.Document"); // Method dosthMethod = clz.getMethod("dosth"); // dosthMethod.invoke(null); Class clz = String.class; Method formatMethod = clz.getMethod("format", String.class,Object[].class); String ret2 = formatMethod.invoke(null, "HashMap的默认初始容量是%d,加载因子是%.2f",new Object[] {16,0.75f}).toString(); System.out.println(ret2); } }
  • 这是直接调用静态方法的传统方式。假设Document类有一个名为dosth()的静态方法,可以直接使用类名调用。
  • String.format是一个静态方法,用于格式化字符串,类似于printf的格式化规则
  • 获取String类的Class对象:使用Class clz = String.class;
  • 获取String类的Class对象:使用Class clz = String.class;
  • 调用静态方法:使用invoke(null, "HashMap的默认初始容量是%d,加载因子是%.2f", new Object[] {16, 0.75f})调用静态方法,因为format是静态方法,所以第一个参数是null
  • 注意invoke方法中,Object[]参数必须以数组形式传递,所以用了new Object[] {16, 0.75f}
十、反射的性能问题
反射虽然功能强大,但由于是在运行时动态操作类,因此性能相对较低。此外,反射也会破

坏封装性,使用时要谨慎。

十一、反射的安全性
使用反射时需要注意安全问题,因为它可以绕过 Java 的访问控制机制。例如,可以访问私有

字段或方法,因此在开发中使用反射要特别小心。

十二、反射的常见场景
  • 框架开发:如 Spring 中的依赖注入、Hibernate 中的 ORM 等。
  • 调试工具:如 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/2/16 4:29:29

论文or文案不被AI标痕迹?AIGC率检测原理 + 分场景降AIGC率操作手册

当教授对着你的论文皱眉&#xff0c;当编辑将你的稿件标记为“疑似AI生成”&#xff0c;背后是一套怎样的检测机制在运作&#xff1f;我们又该如何让AI助力的文字回归“人味”&#xff1f;在人工智能文本生成技术飞速发展的今天&#xff0c;AIGC检测器已成为教育、出版和内容平…

作者头像 李华
网站建设 2026/2/16 9:10:38

Qode叔同深度解析AI Coding:从产品演进到未来开发者生存之道

Qode叔同深度解析AI Coding&#xff1a;从产品演进到未来开发者生存之道 在AI Coding浪潮席卷行业的当下&#xff0c;不同产品形态层出不穷&#xff0c;开发者的工作模式也在悄然变革。Qode创始人叔同结合自身产品实践&#xff0c;从AI Coding的产品阶段划分、Qoder的差异化定位…

作者头像 李华
网站建设 2026/2/6 11:17:15

HeyGem生成政府宣传视频合规性注意事项

HeyGem生成政府宣传视频合规性注意事项 在政策宣贯、公共信息发布日益频繁的今天&#xff0c;政府部门对宣传内容的传播效率和信息安全提出了更高要求。传统视频制作依赖专业团队拍摄与剪辑&#xff0c;周期动辄数天甚至数周&#xff0c;难以应对突发舆情或紧急通知的快速响应需…

作者头像 李华
网站建设 2026/2/10 14:37:12

Ogg音频能用吗?HeyGem小众格式支持情况实测

Ogg音频能用吗&#xff1f;HeyGem小众格式支持情况实测 在数字人视频生成系统日益普及的今天&#xff0c;一个看似微不足道的技术细节——音频格式兼容性&#xff0c;正悄然影响着整个内容生产流程的效率与体验。尤其是在虚拟主播、在线课程、智能客服等高频应用场景中&#xf…

作者头像 李华
网站建设 2026/2/15 14:59:56

一键打包耗时过长?建议分批处理上千个视频任务

一键打包耗时过长&#xff1f;建议分批处理上千个视频任务 在数字人内容爆发的今天&#xff0c;企业越来越依赖自动化视频生成技术来批量制作培训课件、宣传素材或个性化播报。HeyGem 这类基于大模型驱动的音视频同步系统&#xff0c;正是为此而生——只需一段音频和一组视频&a…

作者头像 李华
网站建设 2026/2/10 18:08:11

揭秘PHP实现视频流播放接口的5大核心技巧:解决卡顿与延迟难题

第一章&#xff1a;PHP 视频流播放接口的核心挑战在构建基于 PHP 的视频流播放接口时&#xff0c;开发者面临诸多底层技术难题。由于 PHP 本身是为传统 Web 请求设计的脚本语言&#xff0c;其默认的输出缓冲和请求生命周期并不适合处理大文件或持续的数据流传输。直接读取视频文…

作者头像 李华