在瀏覽FeignClientsRegistar對于向容器注冊有@FeignClient注解的對象的代碼的時候,發(fā)現(xiàn)一個之前比較少關(guān)注到的方法,就是ClassMetadata#isIndependent。
什么叫 class is independent呢往枷?我們先看看這個方法上的注釋。
/**
* Determine whether the underlying class is independent, i.e. whether
* it is a top-level class or a nested class (static inner class) that
* can be constructed independently from an enclosing class.
*/
注釋的意思是道批,判斷是一個class是獨立的,有兩種情況:一.他是top-level的 二.他是nested class也就是靜態(tài)內(nèi)部類入撒。top-level很難翻譯隆豹,我們先去看看Class類中對類的類型的解釋。在java.lang.Class#getEnclosingClass中有一段注釋茅逮,注釋如下:
// There are five kinds of classes (or interfaces):
// a) Top level classes
// b) Nested classes (static member classes)
// c) Inner classes (non-static member classes)
// d) Local classes (named classes declared within a method)
// e) Anonymous classes
注釋將類分為5中類型璃赡,
top level class
nested class (靜態(tài)內(nèi)部類)
inner class(非靜態(tài)內(nèi)部類)
local class(在方法內(nèi)定義的類)
anonymous class(匿名類)
這五種類型可以用一個代碼來解釋下:
我們看看ClassMetadata#isIndependent是怎么來判斷一個class是否是獨立的。
@Override
public boolean isIndependent() {
return (!hasEnclosingClass() ||
(this.introspectedClass.getDeclaringClass() != null &&
Modifier.isStatic(this.introspectedClass.getModifiers())));
}
hasEnclosingClass代碼如下:
@Override
public boolean hasEnclosingClass() {
return (this.introspectedClass.getEnclosingClass() != null);
}
可見isIndependent的判斷邏輯就是 1. 是不是top level class 2.如果不是top level献雅,那是不是nested class碉考?
如果滿足上面兩個條件任何一個,那這個方法就返回true惩琉。
Class類提供的getEnclosingClass方法豆励,如果一個類不是top level的話夺荒,這個方法會返回包含這個類的top level類瞒渠。只有top level的class調(diào)用該方法的時候返回的是null良蒸。