在Java程序中,每个对象都继承自Object类,因此都拥有getClass()方法,该方法可以在运行时返回对象对应的Class对象,而Class对象中包含了类的完整元数据信息,其中就包括完整的类路径名。通过组合使用这两个特性,就能实现运行时动态获取当前对象的完整类路径名的需求。

核心实现原理
Object.getClass()方法的作用是返回此对象的运行时类的Class对象,这个Class对象代表了该对象所属的类。而Class类中提供了getName()方法,该方法会返回当前Class对象所代表的类的完整路径名,也就是包含包名的全限定类名。
整个流程可以拆解为两个步骤:第一步调用目标对象的getClass()方法获取对应的Class实例,第二步调用该Class实例的getName()方法得到完整的类路径名。
基础实现示例
下面是一个简单的示例,演示如何获取自定义对象的完整类路径名:
// 定义一个测试类,放在com.demo包下
package com.demo;
public class TestClass {
private String name;
public TestClass(String name) {
this.name = name;
}
public static void main(String[] args) {
// 创建当前类的实例对象
TestClass obj = new TestClass("测试对象");
// 调用getClass()获取Class对象
Class<?> clazz = obj.getClass();
// 调用getName()获取完整类路径名
String fullClassName = clazz.getName();
// 输出结果
System.out.println("当前对象的完整类路径名是:" + fullClassName);
}
}
运行上述代码后,控制台会输出com.demo.TestClass,这就是该对象的完整类路径名。
不同场景的适配示例
获取内置类对象的类路径名
对于Java内置的类,同样可以使用相同的方式获取完整类路径名,示例如下:
public class BuiltInClassTest {
public static void main(String[] args) {
// 字符串对象
String str = "hello";
System.out.println("String对象的完整类路径名:" + str.getClass().getName());
// 整数对象
Integer num = 100;
System.out.println("Integer对象的完整类路径名:" + num.getClass().getName());
// 数组对象
int[] arr = new int[]{1,2,3};
System.out.println("数组对象的完整类路径名:" + arr.getClass().getName());
}
}
运行结果会依次输出java.lang.String、java.lang.Integer、[I,其中数组的类路径名会以特殊格式表示,[代表数组维度,I代表int类型。
获取匿名内部类的类路径名
如果是匿名内部类的对象,同样可以通过该方式获取类路径名,示例如下:
public class AnonymousClassTest {
public static void main(String[] args) {
// 创建匿名内部类对象
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类运行");
}
};
// 获取匿名内部类的完整类路径名
String className = runnable.getClass().getName();
System.out.println("匿名内部类的完整类路径名:" + className);
}
}
输出的类路径名会包含外部类名称和匿名内部类的编号,格式类似AnonymousClassTest$1。
注意事项
- getClass()方法是实例方法,必须通过对象实例调用,不能直接通过类名调用,比如
TestClass.getClass()这种写法是错误的,需要写成new TestClass().getClass()。 - 如果对象是null,调用getClass()会抛出NullPointerException,因此在实际使用时要先判断对象是否为空。
- getName()返回的是类的全限定名,如果只需要获取简单类名(不包含包名),可以改用Class类的
getSimpleName()方法。 - 对于基本数据类型,不能直接调用getClass()方法,因为基本类型不是对象,需要先转换为对应的包装类再操作。
方法对比
除了使用Object.getClass()获取类路径名,还可以通过其他方式获取,下面是不同方式的对比:
| 获取方式 | 适用场景 | 特点 |
|---|---|---|
| Object.getClass() | 已有对象实例的场景 | 运行时动态获取,返回的是对象实际运行的类类型,适合多态场景 |
| 类名.class | 已知类名的场景 | 编译时确定,不需要创建对象实例,返回的是声明时的类类型 |
| Class.forName("类全路径") | 只知道类路径名的场景 | 会触发类的加载,可能抛出ClassNotFoundException |
实际应用场景
这种运行时获取类路径名的能力在很多场景都有用,比如日志系统中记录对象的类型信息、序列化框架中自动识别对象类型、依赖注入框架中根据类型匹配对应的实现类等。掌握这个基础操作,能够帮助开发者更灵活地处理和类信息相关的需求。
Object.getClass()Java反射类路径名运行时获取类信息修改时间:2026-06-18 07:42:37