Java反射(reflect)
发布日期:2025-04-02 02:48:17 浏览次数:14 分类:精选文章

本文共 2393 字,大约阅读时间需要 7 分钟。

反射在Java编程中扮演着一个非常关键的角色。它允许我们在运行时对类进行操作,而无需事先知道具体的类结构或构造器信息。这对于动态代理、

...
框架以及那些需要基于类动态创建对象的场景尤为重要。

从反射的基本操作说起

反射的核心在于我们可以通过字符串引用类名来获取相应的Class对象。这一能力使得反射能够在运行时对任何一个已存在的或未 compile过的类进行操作。通常情况下,我们会直接使用类实例化操作来创建对象并调用方法,如下所示:

Apple apple = new Apple(); // 正射apple.setPrice(4);

然而,使用反射调用类的方式则完全不同。我们在运行时并不知道要初始化的类是什么,因此无法直接调用new关键字:

Class clz = Class.forName("com.chenshuyi.reflect.Apple");Constructor constructor = clz.getConstructor();Object appleObj = constructor.newInstance();

通过上述代码,我们可以初始化一个Apple对象。这与直接new Apple()创建的对象完全相同,但实现方式不同。


反射的常用API

获取反射中的Class对象

反射中获取类的能力是一个基础操作。我们可以通过以下方法获取Class对象:

  • Class.forName静态方法:当你知道类的全名路径时,可以使用Class.forName方法获取Class对象:

    Class clz = Class.forName("java.lang.String");
  • Class字段:如果在开发阶段直接知道需要使用的类,可以直接使用该类的class字段:

    Class clz = String.class;
  • getClass方法:每个对象都可以调用getClass()方法获取它对应的Class对象:

    String str = "hello";Class clz = str.getClass(); // 返回String.class

  • 通过反射创建类对象

    创建反射类对象有两种主要方式:

  • 通过Class对象的newInstance方法

    Class clz = Apple.class;Apple apple = (Apple) clz.newInstance();
  • 通过Constructor对象的newInstance方法

    Class clz = Apple.class;Constructor constructor = clz.getConstructor();Apple apple = (Apple) constructor.newInstance();
  • 如果需要调用带参数的构造方法,则需要获取特定构造器并使用newInstance()方法:

    Class clz = Apple.class;Constructor constructor = clz.getConstructor(String.class, int.class);Apple apple = (Apple) constructor.newInstance("红富士", 15);

    通过反射获取类属性、方法、构造器

  • 获取类属性

    使用getFields()getDeclaredFields()方法可获取类的属性:

    Class clz = Apple.class;Field[] fields = clz.getFields();for (Field field : fields) {    System.out.println(field.getName()); // 输出: price}

    getDeclaredFields()方法可以获取所有属性,包括私有属性。

  • 获取类方法

    获取方法时,可以使用getMethod()getDeclaredMethod()方法:

    Class clz = Apple.class;Method setPriceMethod = clz.getMethod("setPrice", int.class);
  • 获取类构造器

    获取构造器时,使用getConstructors()getDeclaredConstructors()方法:

    Class clz = Apple.class;Constructor[] constructors = clz.getConstructors();

  • 反射的典型用途

    反射是Java中许多框架和库的核心技术之一。例如:

  • 动态代理:使用反射创建接口的动态代理实现,允许在运行时指定具体的实现类。

  • 反射式配置:在像Spring这样的框架中,通过反射读取配置文件中的类名,并创建相应的对象。

  • 调试和分析:反射提供了强大的调试工具,允许在运行时解析类、方法和字段信息。


  • JDK反射实现的深入探讨

    反射在JDK中的实现主要集中在MethodConstructor类的invoke方法。该方法通过动态代理和委派机制实现反射调用,其工作流程是:

  • 获取Method对象
  • 获取Constructor对象
  • 调用方法或构造器,通过Method.invoke()Constructor.newInstance()
  • 反射的性能优化在JDK中通过多工方法和延迟加载机制实现,最终目的是在运行时平衡性能和灵活性。


    能力总结

    反射赋予了我们对Java类的强大控制能力。它允许我们在运行时:

    • 获取目标类及其所有属性和方法。
    • 创建目标类的实例。
    • 调用目标类的方法或修改其属性。

    通过合理使用反射,我们可以在很多场景中实现高度的灵活性和动态性。然而,反射操作通常比直接操作类实例更慢,因此在性能敏感的场景中需要谨慎使用。

    上一篇:Java反射(全面又容易懂)
    下一篇:java反射(4):Constructor代表类

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月04日 03时03分41秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    c++ 数组批量赋值_数组之间不能赋值?穿个马甲吧! 2023-01-24
    continue可以用if判断里面吗_谁能说说if()else()里的continue是干嘛的? 2023-01-24
    ctrl c 和 ctrl v 不能用了_神奇操作,原来CTRL键还能这么用 2023-01-24
    cytoscape安装java_Cytoscape史上最全攻略 2023-01-24
    c语言程序设计年历显示,C语言程序设计报告《万年历》.doc 2023-01-24
    C语言程序设计梁海英答案,1.5 习题 2023-01-24
    c语言编写单片机中断,C语言AVR单片机中断程序写法 2023-01-24
    ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结 2023-01-24
    excel中最常用的30个函数_Excel玩转数据分析常用的43个函数! 2023-01-24
    flink sql设置并行度_Flink 参数配置和常见参数调优 2023-01-24
    go 字符串替换_Go 每日一库之 quicktemplate 2023-01-24
    hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版... 2023-01-24
    ICLOUD储存空间要升级吗_有人像我一样需要恢复苹果手机icloud空间ios备份时 微信卡住不动了吗(已解决)... 2023-01-24
    jaccard相似度_自然语言处理之文本相似度计算 2023-01-24
    java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单! 2023-01-24
    java攀枝花市房屋租售信息管理平台的设计与实现(ssm) 2023-01-24
    java教学团队管理系统(ssm) 2023-01-24
    java教学网站(ssm) 2023-01-24
    java教学质量管理平台(ssm) 2023-01-24
    java教师教学质量评估系统(ssm) 2023-01-24