2016-01-14 20 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