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

文章目录

  • [462. Java 反射 - 获取声明类与封闭类](#462. Java 反射 - 获取声明类与封闭类)
    • [1. 获取声明类:`getDeclaringClass()`](#1. 获取声明类:getDeclaringClass())
    • [2. 获取封闭类:`getEnclosingClass()`](#2. 获取封闭类:getEnclosingClass())
    • [3. 匿名类的差异](#3. 匿名类的差异)
    • [4. 总结](#4. 总结)

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() 一样
    • 对于匿名类,返回定义它的外部类
相关推荐
Zguigo11 分钟前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
GitFun17 分钟前
给策略加了条-8%止损线,11年只触发1次
python·股票·量化交易
-Marks-30 分钟前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
马六六i1 小时前
市面上正规的IP驱动产业新场景新工具有哪些
大数据·网络·python·tcp/ip
Shadow(⊙o⊙)1 小时前
C++11并发支持库
开发语言·c++
一技安身1 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言
java、iOS、Vue1 小时前
Maven antrun vs Jenkins 脚本组装 deb的优缺点、适用场景
java·jenkins·maven
hudd6682 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
I Am a robert girl2 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
天若有情6732 小时前
开源|Comfort Lang v1.0.1,一款主打清爽交互的新型命令式编程语言
python·开源·交互·编程语言·项目分享·repl·comfort lang