456. Java 反射 - 浅层方法访问

发布时间:2026/10/20 13:46:54
456. Java 反射 - 浅层方法访问 文章目录456. Java 反射 - 浅层方法访问1. 查看类的所有方法2. 通过 Reflection 调用方法3. 动态调用静态方法3.1 目标3.2 示例代码3.3 输出示例4. 总结456. Java 反射 - 浅层方法访问在前面的课程中我们学习了如何获取对象的Class现在我们来探索如何通过 Reflection 获取类的方法并调用它们。1. 查看类的所有方法我们可以使用Class.getMethods()获取某个类的所有公共方法包括继承的接口方法和父类方法importjava.util.Iterator;importjava.util.stream.Stream;publicclassMethodsOnIterator{publicstaticvoidmain(String[]args){Stream.of(Iterator.class.getMethods()).forEach(System.out::println);}}输出示例以 Java 21 为例publicdefaultvoidjava.util.Iterator.remove()publicdefaultvoidjava.util.Iterator.forEachRemaining(java.util.function.Consumer)publicabstractbooleanjava.util.Iterator.hasNext()publicabstractjava.lang.Objectjava.util.Iterator.next()✅说明可以看到迭代器的方法包括抽象方法和默认方法Reflection 可以让我们在运行时访问这些方法并调用它们2. 通过 Reflection 调用方法假设我们想调用Iterator的forEachRemaining方法importjava.util.List;importjava.util.Iterator;importjava.util.function.Consumer;publicclassMethodsOnIteratorCalling{publicstaticvoidmain(String[]args)throwsReflectiveOperationException{// 创建一个迭代器IteratorStringiteratorArrays.asList(Hello,Dev,Java).iterator();// 1. 获取 forEachRemaining 方法// 注意需要指定参数类型的 Class 对象MethodforEachRemainingMethodIterator.class.getMethod(forEachRemaining,Consumer.class);// 2. 准备参数定义一个 Consumer 用于打印ConsumerStringprintlnSystem.out::println;// 3. 调用方法// invoke(对象实例, 参数...)forEachRemainingMethod.invoke(iterator,println);}}✅注意事项可能会抛出异常如NoSuchMethodException或IllegalAccessExceptionJava 7 引入ReflectiveOperationException覆盖了所有反射相关异常3. 动态调用静态方法Reflection 还可以用来动态调用静态方法即使我们在编写代码时并不知道具体方法。下面是一个实战示例3.1 目标对一个数字列表进行操作在Collections类中查找所有返回类型为void、参数为List的方法调用这些方法并观察效果3.2 示例代码importjava.util.Collections;importjava.util.List;importjava.util.stream.Collectors;publicclassCollectionsListMethods{publicstaticvoidmain(String[]args)throwsReflectiveOperationException{// 1. 准备数据将 π 的前 16 位数字拆分为 ListIntegerStringpiStr3141592653589793;ListIntegerpipiStr.chars().map(c-c-0).boxed().collect(Collectors.toList());System.out.println(原始列表: pi);// 2. 遍历 Collections 的所有公共方法for(Methodmethod:Collections.class.getMethods()){// 筛选条件// 1. 返回值为 void// 2. 参数个数为 1// 3. 参数类型为 Listif(method.getReturnType()void.classmethod.getParameterCount()1method.getParameterTypes()[0]List.class){System.out.println(调用方法: method.getName());// 3. 调用静态方法// 注意调用静态方法时invoke 的第一个参数传 nullmethod.invoke(null,pi);System.out.println(结果: pi);System.out.println(---);}}}}3.3 输出示例原始列表:[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3]调用方法:reverse()[3,9,7,9,8,5,3,5,6,2,9,5,1,4,1,3]调用方法:sort()[1,1,2,3,3,3,4,5,5,5,6,7,8,9,9,9]调用方法:shuffle()[5,7,4,9,9,9,2,1,6,5,3,3,1,5,3,8]✅说明找到了三个匹配方法reverse(),sort(),shuffle()静态方法的调用不依赖实例invoke(null, args…)这种方式可以用于动态处理集合或调用工具类方法4. 总结Reflection 可以访问类的所有公共方法可以动态调用实例方法和静态方法异常处理ReflectiveOperationException统一处理反射异常应用场景框架动态调用方法如 ORM、注解处理工具类通用操作如自动排序、集合操作

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询