【问题标题】:Proper definition of java dynamic class loadingjava动态类加载的正确定义
【发布时间】:2016-06-02 23:44:19
【问题描述】:

据我了解,所有 java 类都是动态加载到内存中的, 那是当 JVM 第一次看到 CLASS 符号时,它会将其内容加载到内存中。

在java中我们习惯说我们正在让JVM动态加载一个类 执行以下操作时:

(1)

 Class aClass = classLoader.loadClass("com.stackoverflow.MyClass");

但是,根据我之前所说的,对我来说,JVM 似乎总是做同样的事情。 我的意思是使用 sn-p (1) 加载类不需要更多的步骤,而不是在 JVM 第一次碰到类符号。

我有什么问题吗? 他们一直是两个不同的概念吗? 谢谢

【问题讨论】:

    标签: java class jvm classloader dynamic-loading


    【解决方案1】:

    嗯,它们并不完全相同,但总的来说,你是对的,classLoader.loadClass("com.stackoverflow.MyClass") 提供的效果与在你的类中简单地引用 com.stackoverflow.MyClass 基本相同。

    classLoader.loadClassClass.forName 等的主要功能是它们允许您加载一个不是由硬编码字符串命名的类。例如,类名可能出现在配置文件中。 (例如,The Spring framework 尽其所能。)

    其次,在类无法加载的情况下,这些方法还会引发更易于处理的异常。例如,SLF4J 提供了一个 API JAR 文件,其他库可以对其进行编译,但最终应用程序可以部署几个不同的实现 JAR 文件(一个委托给 Log4j,一个委托给 java.util.logging .Logger 等)。在运行时,SLF4J 尝试通过动态加载org.slf4j.impl.StaticLoggerBinder 来查找部署的实现,但如果找不到,它只会打印一个警告(并且默认为无操作实现)而不是炸毁。如果 SLF4J API JAR 文件中的类静态依赖于 org.slf4j.impl.StaticLoggerBinder 类,则此方法将不起作用。

    【讨论】:

      【解决方案2】:

      我认为classLoader.loadClass("com.stackoverflow.MyClass") 所做的是告诉编译器为当前的类加载器显式加载指定的类。在类已经在执行程序的类路径中的正常情况下,您的假设是正确的,默认情况下它已经加载。

      但是,在某些情况下,可能需要从其他来源(如网络或二进制流)读取类。在这种情况下,默认加载行为可能不会读取这些类,并且 loadClass() 将指示编译器显式加载它们。

      更多详情可以参考ClassLoader javadoc

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 2012-10-10
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        相关资源
        最近更新 更多