465. Java 反射 - 获取类的简单名
在反射 API 中,类的简单名 就是它在 源代码里出现的名字,不带包名。
1. 基本用法
java
Class<?> c = String.class;
System.out.println("Simple name: " + c.getSimpleName());
输出:
java
Simple name: String
✅ 说明:
String的完整类名是java.lang.String- 简单名 就是去掉包之后的
String
2. 匿名类的简单名
匿名类在源码里没有名字,因此 getSimpleName() 返回的是 空字符串。
java
Object key = new Object() {}; // 匿名类
Class<?> c = key.getClass();
System.out.println("Simple name: " + c.getSimpleName());
输出:
java
Simple name:
✅ 说明:
- 匿名类的名字由编译器生成,通常包含
$1,$2这样的后缀 - 没有简单名 ,因此返回
""
3. Lambda 表达式的简单名
Lambda 在字节码里也是编译器生成的类,它的名字可能包含外部类名和 $$Lambda。
java
import java.util.function.Supplier;
Supplier<String> supplier = () -> "Hello";
Class<?> c = supplier.getClass();
System.out.println("Simple name: " + c.getSimpleName());
可能输出(不同 JVM 环境略有不同):
java
Simple name: Main$$Lambda/0x0000025851003538
✅ 说明:
Main是当前外部类的名字$$Lambda/...表示这是一个编译器生成的 lambda 类- 不同运行环境输出可能不一样,但规律类似
4. 对比 getCanonicalName() vs getSimpleName()
| 方法 | 输出 | 示例 |
|---|---|---|
getCanonicalName() |
完整类名(带包) | java.lang.String |
getSimpleName() |
简单名(源码中的类名) | String |
匿名类 getSimpleName() |
空字符串 | "" |
Lambda getSimpleName() |
外部类名 + $$Lambda/... |
Main$$Lambda/0x... |
5. 总结
getSimpleName()用来获取类的源码名字,不含包名- 匿名类 →
""(空字符串) - Lambda 类 → 外部类名 +
$$Lambda/...(JVM 生成,环境相关) - 如果需要打印完整类名,用
getCanonicalName()更合适