文章目录
- [462. Java 反射 - 获取声明类与封闭类](#462. Java 反射 - 获取声明类与封闭类)
462. Java 反射 - 获取声明类与封闭类
在反射中,有两个方法可以帮助我们理解一个类与它外部环境的关系:
getDeclaringClass()------ 获取声明该类的外部类(Declaring Class)getEnclosingClass()------ 获取该类所在的封闭类(Enclosing Class)
这两者经常相同,但在匿名类或局部类的场景下会不同。
1. 获取声明类:getDeclaringClass()
示例代码
java
Class<?> c = Character.UnicodeBlock.class;
Class<?> declaringClass = c.getDeclaringClass();
System.out.println("class: " + declaringClass);
输出
class: class java.lang.Character
✅ 说明:
Character.UnicodeBlock是Character的一个成员类,因此它的 声明类 就是Character。- 如果一个类不是任何类的成员(例如
String、Object),结果就是null。 - 匿名类的
declaringClass始终是null。
匿名类示例
java
Object key = new Object() {}; // 匿名类
Class<?> anonymousClass = key.getClass();
System.out.println("Declaring class: " + anonymousClass.getDeclaringClass());
输出:
java
Declaring class: null
2. 获取封闭类:getEnclosingClass()
示例代码
java
Class<?> c = Character.UnicodeBlock.class;
Class<?> enclosingClass = c.getEnclosingClass();
System.out.println("class: " + enclosingClass);
输出
java
class: class java.lang.Character
✅ 说明:
- 对于普通成员类,
getDeclaringClass()和getEnclosingClass()返回结果一致。
3. 匿名类的差异
java
var key = new Object() {}; // 匿名类
Class<?> anonymousClass = key.getClass();
System.out.println("Declaring class: " + anonymousClass.getDeclaringClass());
System.out.println("Enclosing class: " + anonymousClass.getEnclosingClass());
可能输出(根据 IDE 或编译环境不同会略有差异):
java
Declaring class: null
Enclosing class: class Main
✅ 说明:
Declaring class = null,因为匿名类没有"声明类"。Enclosing class = Main,表示这个匿名类是定义在Main类中的。
这就是 声明类(Declaring) vs 封闭类(Enclosing) 的关键区别。
4. 总结
getDeclaringClass()- 返回"在哪个外部类里声明的"
- 适用于成员类(
public/protected/private static/非静态内部类) - 匿名类永远返回
null
getEnclosingClass()- 返回"在哪个类中被封闭的"
- 对于成员类,结果与
getDeclaringClass()一样 - 对于匿名类,返回定义它的外部类