465. Java 反射 - 获取类的简单名
在反射 API 中,类的简单名就是它在 源代码里出现的名字,不带包名。
1. 基本用法
Class<?> c = String.class;
System.out.println("Simple name: " + c.getSimpleName());
输出:
Simple name: String
✅ 说明:
-
String的完整类名是java.lang.String -
简单名就是去掉包之后的
String
2. 匿名类的简单名
匿名类在源码里没有名字,因此 getSimpleName() 返回的是 空字符串。
Object key = new Object() {}; // 匿名类
Class<?> c = key.getClass();
System.out.println("Simple name: " + c.getSimpleName());
输出:
Simple name:
✅ 说明:
- 匿名类的名字由编译器生成,通常包含
$1,$2这样的后缀 -
没有简单名,因此返回
""
3. Lambda 表达式的简单名
Lambda 在字节码里也是编译器生成的类,它的名字可能包含外部类名和 $$Lambda。
import java.util.function.Supplier;
Supplier<String> supplier = () -> "Hello";
Class<?> c = supplier.getClass();
System.out.println("Simple name: " + c.getSimpleName());
可能输出(不同 JVM 环境略有不同):
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()更合适