object.getclass().getname() 返回运行时类的完整类路径名(全限定名),如"java.util.arraylist",适用于多态、数组及动态加载,但null引用会抛出nullpointerexception。

在 Java 中,Object.getClass() 是获取运行时类信息最直接的方式。调用它会返回一个 Class 对象,而该对象的 getName() 方法即可返回**完整类路径名(即全限定名,Fully Qualified Name)**,包括包名和类名,用点号分隔。
获取完整类路径名:getClass().getName()
这是最常用、最可靠的方法:
-
obj.getClass().getName()返回形如"java.util.ArrayList"或"com.example.MyService"的字符串; - 它在继承链中始终返回**实际运行时类型**,而非声明类型,因此适用于多态场景;
- 注意:对数组类型也有效,例如
new int[5].getClass().getName()返回"[I"(JVM 内部表示),而new String[0].getClass().getName()返回"[Ljava.lang.String;"—— 若需更友好的数组名,可用Class.getSimpleName()配合逻辑处理,但getName()才是标准完整路径。
与 getCanonicalName() 和 getSimpleName() 的区别
避免混淆,关键差异如下:
-
getName():返回 JVM 规范的二进制名称,**可直接用于Class.forName()**,是真正意义上的“完整类路径名”; -
getCanonicalName():返回 Java 语言规范中的规范名,对匿名类返回null,对局部类可能不包含足够上下文,**不可靠用于动态加载**; -
getSimpleName():仅返回类名(如"ArrayList"),不含包名,**不能作为完整路径使用**。
实用示例:日志、调试与泛型擦除补偿
常见使用场景及写法:
- 打印当前实例类型:
System.out.println("Type: " + this.getClass().getName()); - 在通用工具方法中识别类型:
if ("com.example.User".equals(obj.getClass().getName())) { ... }(注意:通常建议用instanceof或isAssignableFrom做类型判断,字符串比对仅适用于配置驱动等特殊场景); - 配合
Class.forName()动态加载同类实例(需确保类在 classpath 中):Class> clazz = obj.getClass(); Object newInstance = clazz.getDeclaredConstructor().newInstance();; - 弥补泛型信息丢失:虽然
getClass()无法还原泛型参数(因类型擦除),但它能准确给出**实际承载数据的容器类型**,例如ArrayList<string></string>和ArrayList<integer></integer>运行时都返回"java.util.ArrayList"。
注意事项与边界情况
使用时需留意以下细节:
-
null引用不能调用getClass()—— 会抛出NullPointerException,务必先判空; - 基本类型(
int、boolean等)没有getClass()方法,其包装类(Integer.class)才支持; - 对于代理对象(如 Spring AOP 生成的 CGLIB 代理),
getClass().getName()返回的是代理类名(如"com.example.Service$$EnhancerBySpringCGLIB$$..."),若需原始目标类,应结合org.springframework.aop.support.AopUtils.getTargetClass()或检查getSuperclass()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











