今天看Spring boot 源码时,获取类上注解信息时用到了Class.getEnclosingClass进行一些逻辑判断。一直没注意这个,于是好好了解了一下。下面将详细讲解一下
首先,类分为五种:
(1)顶层类
(2)静态嵌套类
(3)内部类(非静态的嵌套类)
(4)局部类(方法中定义的类)
(5)匿名类
下面通过一段代码来详细说明
package com.mall.pkgscan1.bean;
/**
* @since 2024/12/1 9:29
*/
// 顶层类
public class UserInfo {
// 嵌套类
static class FemaleUser {
}
// 内部类
class UserBaseInfo {
}
public static void main(String[] args) {
UserInfo userInfo = new UserInfo();
// 匿名类
UserInfo anonymousUser = new UserInfo() {
};
System.out.println("UserInfo.enclosingClass:" + UserInfo.class.getEnclosingClass());
System.out.println("FemaleUser.enclosingClass:" + FemaleUser.class.getEnclosingClass());
System.out.println("UserBaseInfo.enclosingClass:" + UserBaseInfo.class.getEnclosingClass());
System.out.println("anonymousUser.enclosingClass:" + anonymousUser.getClass().getEnclosingClass());
userInfo.showUserInfo();
}
public void showUserInfo() {
// 局部类
class NameInfo {
}
System.out.println("NameInfo.enclosingClass:" + NameInfo.class.getEnclosingClass());
}
}
上面定义了五种类型的类,并打印它的enclosingClass。结果如下:
可以看到除了顶层类的enclosingClass是null以外,其他的都是UserInfo。所以我们现在应该就能猜到getEnclosingClass是获取它的外围类,Enclosing Class确实也是外围类的意思。
这里在延伸一下,如果在嵌套类中再定义一个内部类,那么这个内部类的外围类是嵌套类还是顶层类呢?答案是嵌套类。