【java】在 Java 中,获取一个类的`Class`对象有多种方式

在 Java 中,获取一个类的Class对象有多种方式。Class对象代表了 Java 中的一个类或接口的运行时类信息,可以用于反射操作。以下是获取Class对象的几种常见方法:

1.使用.class属性

每个类都有一个.class属性,可以直接获取该类的Class对象。

示例代码

java 复制代码
public class MyClass {
    public static void main(String[] args) {
        Class<MyClass> clazz = MyClass.class;
        System.out.println("Class object: " + clazz);
    }
}

2.使用对象的.getClass()方法

任何 Java 对象都有一个.getClass()方法,可以获取该对象的Class对象。

示例代码

java 复制代码
public class MyClass {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        Class<?> clazz = obj.getClass();
        System.out.println("Class object: " + clazz);
    }
}

3.使用完全限定类名调用Class.forName()
Class.forName()方法可以通过类的完全限定名来获取Class对象。这种方法在加载类时会触发类的初始化。

示例代码

java 复制代码
public class MyClass {
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("com.example.MyClass");
            System.out.println("Class object: " + clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.使用.getClassLoader().loadClass()
ClassLoader.loadClass()方法也可以通过类的完全限定名来加载类并获取Class对象。与Class.forName()不同,loadClass()不会触发类的初始化。

示例代码

java 复制代码
public class MyClass {
    public static void main(String[] args) {
        try {
            ClassLoader classLoader = MyClass.class.getClassLoader();
            Class<?> clazz = classLoader.loadClass("com.example.MyClass");
            System.out.println("Class object: " + clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

5.使用.getDeclaredClass()方法(Java 9+)

从 Java 9 开始,Class类提供了一个新的方法getDeclaredClass(),可以获取类的Class对象。

示例代码

java 复制代码
public class MyClass {
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.getDeclaredClass("com.example.MyClass");
            System.out.println("Class object: " + clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

6.使用.getDeclaredConstructor().newInstance()(间接获取)

虽然这种方法不是直接获取Class对象,但可以通过创建对象来间接获取Class对象。

示例代码

java 复制代码
import java.lang.reflect.Constructor;

public class MyClass {
    public static void main(String[] args) {
        try {
            Constructor<MyClass> constructor = MyClass.class.getDeclaredConstructor();
            constructor.setAccessible(true);
            MyClass instance = constructor.newInstance();
            Class<?> clazz = instance.getClass();
            System.out.println("Class object: " + clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

以下是获取Class对象的几种常见方法:

• 使用.class属性:直接获取类的Class对象。

• 使用对象的.getClass()方法:通过对象获取其Class对象。

• 使用Class.forName():通过类的完全限定名获取Class对象,会触发类的初始化。

• 使用ClassLoader.loadClass():通过类的完全限定名加载类,不会触发类的初始化。

• 使用Class.getDeclaredClass()(Java 9+):通过类的完全限定名获取Class对象。

• 通过创建对象间接获取:使用反射创建对象后,通过对象的.getClass()方法获取Class对象。

根据你的具体需求,可以选择合适的方法来获取Class对象。

相关推荐
小学鸡!14 分钟前
Spring Boot通过手机号获取归属地
java·spring boot
pedestrian_h1 小时前
操作系统-线程
android·java·开发语言
A-code1 小时前
C/C++ 中 void* 深度解析:从概念到实战
c语言·开发语言·c++·经验分享·嵌入式
whltaoin1 小时前
【JAVA全栈项目】弧图图-智能图床 SpringBoot+Vue3 :[框架开荒:一文全步骤打通前后端项目全流程]
java·spring boot·vue·开源项目·全栈·cos
gfdgd xi2 小时前
GXDE 内核管理器 1.0.1——修复bug、支持loong64
android·linux·运维·python·ubuntu·bug
Fu1co2 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·spring
国服第二切图仔2 小时前
Rust中泛型函数实现不同类型数据的比较
开发语言·后端·rust
递归不收敛2 小时前
专属虚拟环境:Hugging Face数据集批量下载(无登录+国内加速)完整指南
人工智能·笔记·git·python·学习·pycharm
我是小邵2 小时前
主流数据分析工具全景对比:Excel / Python / R / Power BI / Tableau / Qlik / Snowflake
python·数据分析·excel
我命由我123453 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架