462. Java 反射 - 获取声明类与封闭类

462. Java 反射 - 获取声明类与封闭类

在反射中,有两个方法可以帮助我们理解一个类与它外部环境的关系:

  • getDeclaringClass() —— 获取声明该类的外部类(Declaring Class)
  • getEnclosingClass() —— 获取该类所在的封闭类(Enclosing Class)

这两者经常相同,但在匿名类或局部类的场景下会不同。


1. 获取声明类:getDeclaringClass()

示例代码

Class<?> c = Character.UnicodeBlock.class;
Class<?> declaringClass = c.getDeclaringClass();
System.out.println("class: " + declaringClass);

输出

class: class java.lang.Character

说明

  • Character.UnicodeBlockCharacter 的一个成员类,因此它的 声明类 就是 Character
  • 如果一个类不是任何类的成员(例如 StringObject),结果就是 null
  • 匿名类的 declaringClass 始终是 null

匿名类示例

Object key = new Object() {}; // 匿名类
Class<?> anonymousClass = key.getClass();
System.out.println("Declaring class: " + anonymousClass.getDeclaringClass());

输出:

Declaring class: null

2. 获取封闭类:getEnclosingClass()

示例代码

Class<?> c = Character.UnicodeBlock.class;
Class<?> enclosingClass = c.getEnclosingClass();
System.out.println("class: " + enclosingClass);

输出

class: class java.lang.Character

说明

  • 对于普通成员类,getDeclaringClass()getEnclosingClass() 返回结果一致。

3. 匿名类的差异

var key = new Object() {}; // 匿名类
Class<?> anonymousClass = key.getClass();

System.out.println("Declaring class: " + anonymousClass.getDeclaringClass());
System.out.println("Enclosing class: " + anonymousClass.getEnclosingClass());

可能输出(根据 IDE 或编译环境不同会略有差异):

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() 一样
    • 对于匿名类,返回定义它的外部类
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容