当前位置: 首页 > news >正文

02.Class对象的理解

嘿嘿,接下来一步步拆解吧!!!

1.在标准 Java 编译过程中(通过javac编译器编译.java文件),所有类都会生成对应的.class文件

那么要是当前程序没有用到某个类,那个类也会生成对应的.class文件吗?

  • 答案是:会!
    原因是:.class文件的生成是编译阶段的行为(由javac编译器完成),而 “是否会被调用执行” 是运行阶段的行为—— 两者完全独立,编译时不会判断类是否被使用,只要源文件中定义了类,就会生成对应的.class文件。javac的职责是将.java源文件中所有类定义(无论是否被使用)转换为字节码,并生成对应的.class文件,它不分析类在运行时是否被调用、是否有用,仅负责语法校验和字节码生成。

2.ClassLoader的核心作用

  • ①定位字节码:从磁盘(如classes目录)、网络(如 Applet)、内存(动态生成的字节码)等位置找到类的字节码(.class文件)

  • ②读取字节码:将字节码数据读取到 JVM 内存中

  • ③生成 Class 对象:将字节码解析为 JVM 可识别的格式,在方法区(Method Area)生成对应的Class对象(类的元数据),作为后续创建实例的 “模板”

3.真正开始的Class对象(前面都是做好铺垫)

  • ①创建实例对象时,若类未加载,JVM 会自动加载类并创建对应的Class对象;若类已加载,则直接使用已有的Class对象

  • ②获取Class对象

    • 类名.class:编译时就能确定要获取的类,效率高
    • 对象.getClass():需要先有实例对象
    • Class.forName(全类名):参数为全限定名(动态加载)
  • ③通过Class对象实例化对象

    • a.获取无参构造器(参数列表为空)
    Constructor<?> noArgConstructor = userClass.getConstructor();
    User user = (User)noArgConstructor.newInstance();
    
    • b.获取单参构造器(参数类型为String.class)
    Constructor<?> singleArgConstructor = userClass.getConstructor(String.class);
    User user = (User)singleArgConstructor.newInstance("张三");
    
    • c. 获取私有多参构造器(参数类型为String.class, int.class)
    Constructor<?> privateConstructor = userClass.getDeclaredConstructor(String.class, int.class);
    privateConstructor.setAccessible(true); // 设置私有构造器可访问(关闭访问检查),只要访问私有或其他不可访问的都需要
    User user = (User)privateConstructor.newInstance("李四", 20);
    

4.反射调用私有方法

  • 4.1 调用私有非静态方法,必须持有实例,说明是调用该实例中的方法。
    例如:前面已经实例化 user
Method method = userClass.getDeclaredMethod("show", String.class);
method.setAccessible(true);
method.invoke(user, "余");

必须得通过 class 对象才能进行反射,class 对象是反射的唯一入口。
反射的本质是:程序运行时,通过Class对象(类的元数据)动态获取目标结构信息(方法、属性等),并突破 JVM 访问权限限制操作这些成员的机制。如果没有Class对象查找函数,你根本不知道user里有没有add函数、参数需要什么类型、返回值是什么,就像 “闭着眼睛找钥匙开门”,完全摸黑。
一句话戳破:实例里有 “函数的执行能力” 但没有 “函数的描述信息”,Class对象里有 “函数的描述信息” 但没有 “执行能力”,反射就是拿Class的 “描述信息” 去指导实例的 “执行能力”。

  • 4.2 调用私有静态方法,不用持有实例,静态方法归属于类本身而非实例。
    注意:Class的具体实例才能执行,故method.invoke第一个参数传null即可。

总结

Class对象是 “人的技能说明书”帮你找到他的隐藏技能、知道让他怎样做,没有说明书, 你连他会什么都不知道,更没法让他做指定的事。
Class对象只存在 “函数的描述信息”(方法名、访问权限、返回值类型、参数类型、该方法所在字节码),没有提供获取方法体代码的 API。“能执行方法” 是因为 JVM 从方法区加载了执行步骤,而非Class对象操作的。Class元数据中存储了方法的入口地址。

http://www.zskr.cn/news/67185.html

相关文章:

  • 添加断言
  • 2025哈尔滨净化改造工程TOP5权威推荐:甄选企业守护洁净
  • 全屋定制制造厂TOP5权威推荐:售后与品质双优之选,破解行业
  • 2025 TOPDON ArtiDiag 900 Lite 8 Scan Tool: Full System Diagnostics 8 Resets for EU/US Cars
  • C#AI系列(3):31mb单文件exe实现姿态检测-将Yolo装进口袋
  • 2025年全屋定制品牌制造企业选择哪家好?全屋定制品牌生产厂
  • 2025年黑龙江十大医疗工业改造工程公司推荐:口碑不错的改造
  • 详细介绍:【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
  • 2025年哈尔滨全屋定制品牌十大排行榜,久木定制测评推荐
  • TopDiag P181 Wire Finder: Effortlessly Locate Automotive Wire Breakpoints Short Circuits
  • 2025年RFID衣物洗涤标签供货厂家权威推荐榜单:酒店洗涤RFID标签‌/RFID洗涤耐高压标签‌/RFID布草智能管理‌源头厂家精选
  • 2025年平板运输车制造企业权威推荐榜单:遥控平板车‌/顶升电动平车‌/升降电动平车‌源头厂家精选
  • 代码传递
  • 深圳“无人机装调检修工”报考入户全指南:证书含金量超高!
  • 2025年真心话:完稿事半功倍,爆款剧本正中靶心
  • 2025年宣传片制作公司权威推荐指南:技术赋能与创意融合的行业标杆解析
  • 2025年质量好的陕西镍板厂最新用户好评榜
  • 申威 SW64 适配 Nacos 2.x/3.x:RocksDB 编译、瘦身与完整打包指南
  • [转载]彻底关闭Firefox自动更新及更新提醒
  • 2025年供挤板订做厂家权威推荐榜单:防撞板‌/竹木碳晶板‌/集成墙板‌源头厂家精选
  • 2025年电缆防火涂料直销厂家权威推荐榜单:石膏级防火涂料/膨胀型防火涂料/钢结构防火涂料源头厂家精选
  • 毕业论文神器!6款免费AI工具推荐,轻松搞定论文写作
  • 2025年度常州十大雪山草鸡火锅品牌排行榜,鲜珍珍雪山草鸡火
  • C++ ODB ORM 从入门到实战应用
  • ubuntu_12.04_tftp的安装与设置
  • 组装成树
  • 2025 武汉文化课集训学校权威推荐榜单
  • 2025年评价高的多功能移动餐车十大热门品牌推荐榜
  • 波束赋形MATLAB代码实现
  • 2025年三层别墅电梯优质厂家权威推荐榜单:曳引别墅电梯‌/液压别墅电梯‌/液压别墅电梯‌源头厂家精选