2016-01-14 25 views
3

有以下PMD規則:PMD規則「使用適當的類加載器」的解釋?

使用合適的類裝載器(嚴重)如預期

在J2EE getClassLoader()可能無法正常工作。改爲使用Thread.currentThread().getContextClassLoader()

能稍微解釋一下他們在想什麼嗎?這裏的「J2EE」環境究竟意味着什麼?

回答

1

J2EE環境是指Java企業版。在這裏,您不要將程序作爲JVM上的獨立應用程序運行,而是讓JEE應用程序服務器(例如Glassfish或Tomcat)爲您運行它。

應用服務器提供了很多不同的方式來運行你的程序,例如它們提供併發和分佈式執行。 AppServers與類加載器一起玩,有時候有一個層次結構,例如EAR(Enterprise ARchive)有一個層次結構,而EAR內部的WAR(Web ARchive)有一個不同的層次結構。由於這個原因,不能保證你總能通過getClassLoader()呼叫獲得正確的ClassLoader。隨着Thread.currentThread().getContextClassLoader()你將永遠得到加載你的應用程序的ClassLoader。 (注意:這並非完全正確,有些應用程序使用ContextClassLoader(如Spring,OSGi)製作技巧,但這是獲得正確ClassLoader的最佳方式)。

+0

「得到正確的類加載器」 - 這部分不清楚。如果我說:'ref.getClass()。getClassLoader()',我應該得到加載這個類的類加載器,對吧?這可以如何改變?我不是在討論裝載我的應用程序的類加載器;因爲我的類可能由不同的類加載器加載。 – igr

+0

也許這個職位澄清它︰http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader – Csuki

+0

嗯,我明白了差異,也許我需要澄清我。如果我做'ref.getClass()。getClassLoader()' - 我應該總是得到加載類'ref'的類加載器。這不能改變,對吧?這可能與上下文CL相同也可能不同,但如果需要的話,這也是我需要處理的。有時我需要這個,有時候我不需要。所以我很困惑,爲什麼PMD會對此提出警告 - 這聽起來像是你應該在jee環境中使用的規則 - 並且想知道是否還有更多的東西我看不到。 – igr