cglib生存的class的命名規則有多種,它們都是由介面namingpolicy對應的實現來定義的.接下來針對defaultnamingpolicy進行分析.泛泛的說,生成的class的規則如下
被**class name(包名和類名) + "$$" +
使用cglib處理的class name(只有類名,不包含包名) +"bycglib" + "$$" +
key的hashcode(接下來會對key有乙個詳細的分析) +
序列號下面是上面規則的示例:
aop.target.helloimpl$$enhancerbycglib$$494b5b61
aop.target.helloimpl$$enhancerbycglib$$494b5b61_2
aop.target.helloimpl$$enhancerbycglib$$494b5b61_3
下面是對應的關鍵**
#defaultnamingpolicy
public string getclassname(string prefix, string source, object key, predicate names)
return attempt;
}
key 是什麼?
上面的生成規則有4個引數,其中key是乙個不太好理解的引數
key是乙個物件,該物件封裝了下面7個資訊. 並且這個key物件是由cglib生成的乙個類來建立出來的.
1:superclass
2:inte***ces
3:filter
4:callbacktypes
5:serialversionuid
6:usefactory,
7:interceptduringconstruction
下面的**是生成key的介面定義,以及cglib如何生成此介面的例項
public inte***ce enhancerkey
//enhancer cglib會動態生成乙個介面(enhancerkey)的位元組碼並例項化,接下來將試用此物件生成key來封裝上面提到的幾個引數
private static final enhancerkey key_factory =
(enhancerkey)keyfactory.create(enhancerkey.class);
為什麼有序列號的存在?
通常預設情況是,相同的classload,相同的key只生成乙個只生成一次子類並快取,也就是在defaultnamingpolicy,沒有發現有序列號存在的可能. 序列號應該是在別的場景中使用. 下面是生成的子類是如何通過hashset快取起來的:
protected object create(object key) else if (usecache)
if (gen == null) catch (classnotfoundexception e)
}if (gen == null)
if (usecache)
return firstinstance(gen);
} finally }}
return firstinstance(gen);
} catch (runtimeexception e) catch (error e) catch (exception e)
}
接下來準備,繼續寫乙個博文介紹下面3點
1)cglib如何生成的class的二進位制檔案
2)cglib生成的class二進位制(byte)放哪
3)cglib如何把二進位制load生成的class
Python學習札記
1 strip 去除字串中所有不想要的空白符,split 方法建立乙個列表。2 sorted bif支援複製排序。3 分片,列表推導 4 工廠函式去除掉裡列表中重複的項。5 定義乙個類時,實際上是在定義乙個定製工廠函式。6 使用dict 工廠函式或使用 可以建立乙個空字典。要訪問乙個person字典...
學習Tomcat動態載入JSP的Class類
今天在修改專案乙個jsp檔案時,突然想到tomat是怎麼實現動態實時載入jsp編譯後的class類的?具體原理我將單獨總結一下,這裡簡單實現了動態載入類 1.定義服務類 public class servlet 2.定義服務執行緒 public class servicethread extends...
C 學習札記20140312
謹記,但凡使用了迭代器的迴圈體,都不要向迭代器所屬的容器新增元素!vector物件可以動態增長,但不能應用在範圍for的語句中對vector物件增加元素,還有任何改變vector物件容量的操作都會使得該物件的迭代器失效!不能解引用迭代器的end成員所指向的元素,因為end是指向迭代器的尾後,解引用就...