2025/12/31 12:05:44
网站建设
项目流程
做网站有没有前途,天津网站建设网站推广,wordpress 报名,wordpress自定义后台单页模板一、反射
在Java中#xff0c;Class对象是反射机制的起点#xff0c;它代表了JVM中加载的类的元数据。获取Class对象就像拿到了类的身份证#xff0c;有了它才能进行反射操作#xff08;如动态创建对象、调用方法、修改字段等#xff09;。 通俗比喻#xf…一、反射在Java中Class对象是反射机制的起点它代表了JVM中加载的类的元数据。获取Class对象就像拿到了类的身份证有了它才能进行反射操作如动态创建对象、调用方法、修改字段等。通俗比喻Class对象就像是每个Java类的身份证有了它我们就能在运行时认识这个类了解它的结构甚至操作它的内部。1. 反射的核心Class对象反射的起点是Class对象。每个类被JVM加载后都会生成一个唯一的Class对象该对象存储了类的完整结构信息包括类的名称、包名父类、实现的接口字段Field方法Method构造器Constructor获取Class对象的三种方式Class是一个Java中已经定义好的类类名是Class其中有一个静态方法forName()参数是类名就可以获得到相应类的字节码文件。方式1类名.class类字面常量Class? classObject ClassName.class;原理解析在编译时确定JVM会加载该类并生成Class对象编译器会进行类型检查确保类存在不会触发类的初始化如果类有静态代码块不会执行优点✅ 编译时检查类型安全✅ 性能最好不需要运行时解析✅ 代码简洁缺点❌ 无法动态获取类名需要硬编码类名通俗理解就像你直接在书架上找到某本书的书名书名已经写在书架上你不需要问别人直接就能拿到。方式2对象.getClass()Class? classObject object.getClass();原理解析通过已有的对象实例获取其Class对象该方法是Object类的final方法所有对象都有会触发类的初始化如果类有静态代码块会执行优点✅ 简单直接不需要知道类名✅ 适用于多态场景获取运行时实际类型缺点❌ 必须先有对象实例否则会抛出NullPointerException❌ 无法在没有对象的情况下获取Class对象通俗理解就像你手里已经有一本书直接翻到书的版权页就能看到这本书的身份证。方式3Class.forName()Class? classObject Class.forName(全限定类名);原理解析通过类的全限定名包名类名动态加载类会触发JVM的类加载机制会执行类的静态代码块初始化类优点✅ 高度灵活可以处理字符串形式的类名✅ 适合配置化、动态加载的场景缺点❌ 需要处理ClassNotFoundException异常❌ 性能稍低需要运行时解析类名❌ 会触发类的初始化通俗理解就像你从图书馆的目录表上找到一本书的名称然后去书架上找这本书可能需要等待工作人员帮你找。package com.lkbhua.MyreflectDemo1; public class demo1 { public static void main(String[] args) throws Exception { /* 获取class对象的三种方式: 1. Class.forName(全类名) 2. 对象.getClass() 3. 类名.class */ // 1、Class.forName(全类名) // 全类名: 包名 类名 // 第一种最为常用 Class clazz Class.forName(com.lkbhua.MyreflectDemo1.Student); // 2、打印 System.out.println(clazz); // 2、类名.class // 一般更多的是当作参数进行传递 多线程synchronized(clazz)中 Class clazz2 Student.class; System.out.println(clazz2 clazz); // 3、对象.getClass() // 局限性: 当我们已经有了这个类的对象时才可以使用 Student s new Student(); Class clazz3 s.getClass(); System.out.println(clazz3 clazz); } }三种方式对比总结方式语法是否需要实例是否触发类加载是否触发初始化灵活性性能安全性类名.classClassName.class❌❌❌低需硬编码⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐对象.getClass()object.getClass()✔️❌✔️中⭐⭐⭐⭐⭐⭐⭐⭐Class.forName()Class.forName(全限定类名)❌✔️✔️高可动态⭐⭐⭐⭐注⭐越多表示越好