码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java反射:探索对象创建与类信息获取


    文章目录

      • 1. 对象的创建
      • 2. 类的初始化
        • 2.1 类的加载
        • 2.2 类的连接
        • 2.3 类的初始化
      • 3. 反射是什么?
      • 4. 获取Class类对象
        • 4.1 使用类名.class
        • 4.2 使用对象的getClass()方法
        • 4.3 使用Class.forName()
      • 5. 获取构造器对象
        • 5.1 使用getConstructors()和getDeclaredConstructors()
        • 5.2 使用getConstructor()和getDeclaredConstructor()
      • 6. 获取成员变量对象
        • 6.1 使用getFields()和getDeclaredFields()
        • 6.2 使用getField()和getDeclaredField()
      • 7. 获取成员方法对象
      • 8. 总结

    在这里插入图片描述

    🎉欢迎来到Java学习路线专栏~Java反射:探索对象创建与类信息获取


    • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
    • ✨博客主页:IT·陈寒的博客
    • 🎈该系列文章专栏:Java学习路线
    • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
    • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
    • 📜 欢迎大家关注! ❤️

    Java是一门强大而灵活的编程语言,其中的反射机制允许我们在运行时获取和操作类的信息。本文将深入探讨反射的原理和用法,包括对象的创建、类的初始化、获取Class对象以及访问构造器、成员变量和成员方法。通过了解和掌握反射,您将能够编写更具通用性和灵活性的Java应用程序。
    在这里插入图片描述

    1. 对象的创建

    首先,让我们回顾一下在Java中如何创建对象。通常,我们使用以下方式创建对象:

    Student stu = new Student("张无忌", 18);
    
    • 1

    在这个例子中,stu 是一个引用,它指向了内存中的一个对象。Student 是一个类,它存在于磁盘上的.class文件中。这是我们通常创建对象的方式,但在某些情况下,我们需要更灵活的方式来创建对象,这就是反射发挥作用的地方。
    在这里插入图片描述

    2. 类的初始化

    在深入探讨反射之前,让我们了解一下类的初始化过程。类的初始化包括三个步骤:

    2.1 类的加载

    在类的加载阶段,Java虚拟机将类文件(.class)从磁盘加载到内存中。这个过程由类加载器(ClassLoader)来完成。
    在这里插入图片描述

    2.2 类的连接

    在类的连接阶段,内存会为类的静态变量分配内存,并进行默认初始化。静态变量在类加载时会被初始化。
    在这里插入图片描述

    2.3 类的初始化

    在类的初始化阶段,静态变量会被赋予程序员指定的初始值。在上面的例子中,name 被赋值为 “张无忌”,age 被赋值为 18。
    在这里插入图片描述

    3. 反射是什么?

    反射是Java中的一种机制,允许在运行时获取一个类的变量和方法的信息,然后通过这些信息来创建对象、访问变量和调用方法。反射机制使我们可以在编译时未知类的情况下操作类。

    在这里插入图片描述

    4. 获取Class类对象

    在使用反射之前,我们首先需要获取一个类的Class对象。有三种常用的方式来获取Class对象:
    在这里插入图片描述

    4.1 使用类名.class

    Class<Student> studentClass = Student.class;
    
    • 1

    4.2 使用对象的getClass()方法

    Student student = new Student();
    Class<? extends Student> studentClass = student.getClass();
    
    • 1
    • 2

    4.3 使用Class.forName()

    Class<?> studentClass = Class.forName("com.example.Student");
    
    • 1

    5. 获取构造器对象

    反射允许我们获取类的构造器对象,从而创建对象。有两种主要的方法来获取构造器对象:

    5.1 使用getConstructors()和getDeclaredConstructors()

    Constructor<?>[] constructors = Student.class.getConstructors(); // 获取所有非私有构造器
    Constructor<?>[] declaredConstructors = Student.class.getDeclaredConstructors(); // 获取所有构造器
    
    • 1
    • 2

    5.2 使用getConstructor()和getDeclaredConstructor()

    Constructor<Student> constructor = Student.class.getConstructor(String.class, int.class); // 获取指定参数类型的构造器
    Constructor<Student> declaredConstructor = Student.class.getDeclaredConstructor(String.class, int.class); // 获取指定参数类型的构造器
    
    • 1
    • 2

    通过获取构造器对象,我们可以使用构造器的newInstance方法来创建类的对象:

    Student student = constructor.newInstance("张无忌", 18);
    
    • 1

    6. 获取成员变量对象

    反射还允许我们获取类的成员变量对象,以便读取和修改对象的属性。有两种方法来获取成员变量对象:

    6.1 使用getFields()和getDeclaredFields()

    Field[] fields = Student.class.getFields(); // 获取所有非私有成员变量
    Field[] declaredFields = Student.class.getDeclaredFields(); // 获取所有成员变量
    
    • 1
    • 2

    6.2 使用getField()和getDeclaredField()

    Field field = Student.class.getField("name"); // 获取指定名称的非私有成员变量
    Field declaredField = Student.class.getDeclaredField("age"); // 获取指定名称的成员变量
    
    • 1
    • 2

    通过获取成员变量对象,我们可以使用set方法来修改对象的属性值:

    field.set(student, "新的名字"); // 设置属性值
    
    • 1

    7. 获取成员方法对象

    反射还允许我们获取类的成员方法对象,以便调用对象的方法。有两种方法来获取成员方法对象:

    Method[] methods = Student.class.getMethods(); // 获取所有非私有方法
    Method[] declaredMethods = Student.class.getDeclaredMethods(); // 获取所有方法
    
    • 1
    • 2

    通过获取成员方法对象,我们可以使用invoke方法来调用对象的方法:

    Method method = Student.class.getMethod("getName"); // 获取指定名称的方法
    String name = (String) method.invoke(student); // 调用方法
    
    • 1
    • 2

    8. 总结

    反射是Java中一个强大而灵活的机制,允许我们在运行时获取和操作类的信息。通过获取Class对象、构造器对象、成员变量对象和成员方法对象,我们可以实现动态创建对象、修改属性和调用方法的功能。反射虽然强大,但也需要谨慎使用,因为它会降低代码的可读性和性能。在实际应用中,应该根据需要谨慎使用反射,以充分发挥其优势。

    希望本文能够帮助理解反射的基本原理和用法,更灵活地编写Java应用程序,并更好地应对各种复杂的情况。在深入学习和实践中,更好地掌握反射这一强大工具,提高自己的编程技能。


    🧸结尾


    ❤️ 感谢您的支持和鼓励! 😊🙏
    📜您可能感兴趣的内容:

    • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
    • 【Java学习路线】2023年完整版Java学习路线图
    • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
    • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
    • 【数据结构学习】从零起步:学习数据结构的完整路径

    在这里插入图片描述

  • 相关阅读:
    SQL Server报错:数据库"YourDatabaseName"的事务日志已满,原因为"LOG_BACKUP"
    HEC-RAS 1D/2D水动力与水环境模拟从小白到精通
    java常见的三种定时任务调度框架,写得太棒了
    C++:类和对象(下)
    QT 工具栏设置
    Kafka - Kafka 为啥抛弃 Zookeeper?
    【项目设计】网络对战五子棋(下)
    甘露糖-聚乙二醇-N-羟基琥珀酰亚胺mannose-PEG-NHS
    十一.镜头知识之RI(Relative Illumination)相对照度 与暗角
    数字化下烟草行业人力资源管理实践与思考
  • 原文地址:https://blog.csdn.net/qq_43546721/article/details/132722440
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号