簡體   English   中英

UrlClassLoader范圍

[英]UrlClassLoader scope

我正在使用URLClassLoader從外部jar文件加載類,由此加載的類可能已經存在於我的Web應用程序類加載器中,假設URL類加載器已加載版本1的類A,而Web應用程序已加載版本2的同一類A,一個新線程由web應用程序啟動的需要類A,是否可以從UrlClassloader獲得A而不是從Web應用程序類加載器獲取A? 如果是這樣,如何避免這種情況,如何限制urlclassloader類的作用域僅在特定方法中使用?

請建議將類加載器設置為

Thread.currentThread()getContextClassLoader();

我的工作是處理該類加載器中的類的,一旦完成,將其替換為舊的類加載器嗎?

ClassLoader oldLoader=Thread.currentThread().getContextClassLoader();
            Thread.currentThread().setContextClassLoader(classLoader);
            try{
                siClass=classLoader.loadClass("tools.ds.Signature3");
                result=doWork();
            }catch(Exception e){
                throw new RuntimeException(e);
            }finally{
                Thread.currentThread().setContextClassLoader(oldLoader);
            }
            return result;

這樣我是否將classLoader的范圍僅限制為doWork()操作?

答案在Thread.getContextClassLoader()的javadoc中:

返回此線程的上下文ClassLoader。 線程的創建者提供了上下文ClassLoader,供加載類和資源時此線程中運行的代碼使用。 如果未設置,則默認值為父線程的ClassLoader上下文。 通常將原始線程的上下文ClassLoader設置為用於加載應用程序的類加載器。

因此,如果您不使用該URLClassLoader它應該不會影響您的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM