Java Class.forName(..)是如何工作的,详细说明?

Java Class.forName(..)是如何工作的,详细说明?,java,reflection,Java,Reflection,首先,我知道Class.forName()将一个特定的类加载到classloader并调用它的静态初始值设定项。但是,不久前我在公司的应用程序中发现了一个问题,我们使用了一些Http客户机,它调用每个Http请求类。forName(…),这在负载高峰时会导致问题。它在监视器内部为name(…)锁定数百个线程 这是我的线程图片,它们都在等待监视器 因此,以下是我的问题: 是扫描类路径和web应用程序中的所有JAR吗?(这会是一次长时间的手术吗?) 它是扫描每个调用还是如果类已经加载-它不扫描类路

首先,我知道
Class.forName()
将一个特定的类加载到classloader并调用它的静态初始值设定项。但是,不久前我在公司的应用程序中发现了一个问题,我们使用了一些Http客户机,它调用每个Http请求
类。forName(…)
,这在负载高峰时会导致问题。它在监视器内部为name(…)锁定数百个线程

这是我的线程图片,它们都在等待监视器

因此,以下是我的问题:

  • 是扫描类路径和web应用程序中的所有JAR吗?(这会是一次长时间的手术吗?)
  • 它是扫描每个调用还是如果类已经加载-它不扫描类路径

  • 您可以在运行时使用调试器浏览源代码。我不认为思考的速度特别快,但这都是相对的。我认为你的问题太宽泛了。这在很大程度上取决于您使用的确切产品,哪个JVM,哪个版本的JVM。。。换句话说:您必须给出一个非常具体的问题“我的产品X在该版本的平台Y上做了什么?”。。。但总的来说;你是对的:不加区别地使用
    forName()
    听起来是一个非常糟糕的解决方案。“默认”类加载器执行某些缓存;所以它会记住所有加载的类。但同样:我们不知道在您的环境中运行的是什么类加载器。那我们怎么知道它是干什么的?!换句话说:你的问题读起来像是“我有一辆车,发动机发出奇怪的噪音,有什么问题?”?没有人能从这样的描述中回答这个问题。真正地没有人连乔恩·斯基特都没有。@GhostCat你说得对。我们做了一些变通来避免这种情况。但是,我的规范是:JVM:Java HotSpot(TM)64位服务器VM(25.111-b14,混合模式)Java:version 1.8.0_111,供应商Oracle Corporation ClassLoader class:org.apache.catalina.loader.WebAppClassLoader我怀疑
    class.forName()
    是否是您的问题。对于给定的值,第一次调用它可能会很昂贵,但之后就不应该(太)昂贵了。也就是说,正如GhostCat所提到的,根据你的具体情况(你没有分享),这是完全可能的。