[英]How does GroovyClassLoader/ClassLoader work?
我看到的代碼就像
GroovyClassLoader cLoader = new GroovyClassLoader(this.class.getClassLoader())
接下來是這樣的:
cLoader.loadClass([class name])
我對我應該了解的GroovyClassLoader
類以及this.class.getClassLoader()
的用途感興趣。
類加載器以垂直層次結構方式工作,實際上在java中,此層次結構中有三個內置類加載器:
因此,當您將this.class.getClassLoader(
)傳遞給構造函數時,您將創建一個類加載器,其父級是加載當前類的類加載器,它將為您提供這種類加載器層次結構。
為什么要這樣創建一個類加載器?為什么不用內置的? 那取決於你。
但是,這里要提醒的一個事實是類加載器以自上而下的方式加載類 。 類加載器要求其父級加載一個類,如果父級不能找到它自己加載類的類(注意調用是在進行復活),另一個事實是類加載器有一個緩存 ,加載的類會被緩存一段時間。
所以我通常使用Thread.currentThread.getClassLoader()
(我相信它類似於urs),因為這給了我加載當前正在運行的線程的加載器,我相信它接近我的其他類,希望它可能已經緩存我要求的課程。
根據文檔,傳遞給構造函數的this.class.ClassLoader()
參數然后被視為創建的GroovyClassLoader
的父級(而不是使用當前Thread的上下文類加載器作為父級 - 默認行為)。
我不是類加載的專家,但AFAIK首先調用類加載器的父級來搜索給定的類。
至於應該知道什么,我不能告訴你任何文件中提供的內容。
Groovy是一種腳本語言,因此,您會發現自己處於從文件加載Groovy腳本並想要執行它的很多地方。 這里有兩個問題:
GroovyClassLoader
將確保腳本(在它處於活動狀態時加載)將起作用。 當它被垃圾收集時,它將確保所有資源也可以GC(否則,如果磁盤上的腳本發生更改並且您想重新加載它或者您將耗盡內存等,最終會遇到問題) 。)
Groovy代碼需要訪問普通的Java類,這就是為什么你必須給它一個父類加載器。 Groovy類加載器將向父級詢問它自己不知道的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.