java 动态 class 加载的正确定义
Proper definition of java dynamic class loading
据我所知,所有 java classes 都动态加载到内存中,
也就是说,当 JVM 第一次看到 CLASS 符号时,它会将其内容加载到内存中。
在java中我们习惯说我们正在使JVM动态加载class
执行以下操作时:
(1)
Class aClass = classLoader.loadClass("com.Whosebug.MyClass");
但是,根据我之前所说的,对我来说 JVM 似乎总是做同样的事情。
我的意思是,使用片段 (1) 加载 class 所需的步骤比 JVM 加载 class 所需的步骤更多 第一次碰到 CLASS 符号。
我是不是弄错了什么?
他们一直是两个不同的概念吗?
谢谢
我认为 classLoader.loadClass("com.Whosebug.MyClass")
的作用是告诉编译器为当前 classLoader 显式加载指定的 class。在 class 已经在 class 执行程序的路径中的正常情况下,您的假设是正确的,它已经默认加载。
然而,在某些情况下,可能需要从其他来源(如网络或二进制流)读取 classes。在这种情况下,默认加载行为可能不会读取那些 classes 并且 loadClass() 将指示编译器显式加载它们。
更多详情可以参考ClassLoader javadoc
嗯,它们 并不完全相同,但总的来说,你是对的,classLoader.loadClass("com.Whosebug.MyClass")
给出的效果与简单地引用 [=11] 基本相同=] 在你的 class.
里面
classLoader.loadClass
和 Class.forName
等的主要功能是它们让你加载一个 class ,它是 而不是 命名的一个硬编码的字符串。例如,class-名称可能出现在配置文件中。 (例如,The Spring framework,任何人都可以做到这一点。)
其次,这些方法还会在 class 无法 加载的情况下引发更易于处理的异常。例如,SLF4J 提供单个 API JAR 文件供其他库编译,但也提供几个不同的实现 JAR 文件供最终应用程序部署(一个委托给 Log4j,一个委托给到 java.util.logging.Logger,等等)。在运行时,SLF4J 会尝试通过动态加载 org.slf4j.impl.StaticLoggerBinder
来找到已部署的实现,但如果找不到,它只会打印一条警告(并且默认为无操作实现)而不是崩溃。如果 SLF4J API JAR 文件中的 classes 静态依赖于 org.slf4j.impl.StaticLoggerBinder
class.
,则此方法将不起作用
据我所知,所有 java classes 都动态加载到内存中, 也就是说,当 JVM 第一次看到 CLASS 符号时,它会将其内容加载到内存中。
在java中我们习惯说我们正在使JVM动态加载class 执行以下操作时:
(1)
Class aClass = classLoader.loadClass("com.Whosebug.MyClass");
但是,根据我之前所说的,对我来说 JVM 似乎总是做同样的事情。 我的意思是,使用片段 (1) 加载 class 所需的步骤比 JVM 加载 class 所需的步骤更多 第一次碰到 CLASS 符号。
我是不是弄错了什么? 他们一直是两个不同的概念吗? 谢谢
我认为 classLoader.loadClass("com.Whosebug.MyClass")
的作用是告诉编译器为当前 classLoader 显式加载指定的 class。在 class 已经在 class 执行程序的路径中的正常情况下,您的假设是正确的,它已经默认加载。
然而,在某些情况下,可能需要从其他来源(如网络或二进制流)读取 classes。在这种情况下,默认加载行为可能不会读取那些 classes 并且 loadClass() 将指示编译器显式加载它们。
更多详情可以参考ClassLoader javadoc
嗯,它们 并不完全相同,但总的来说,你是对的,classLoader.loadClass("com.Whosebug.MyClass")
给出的效果与简单地引用 [=11] 基本相同=] 在你的 class.
classLoader.loadClass
和 Class.forName
等的主要功能是它们让你加载一个 class ,它是 而不是 命名的一个硬编码的字符串。例如,class-名称可能出现在配置文件中。 (例如,The Spring framework,任何人都可以做到这一点。)
其次,这些方法还会在 class 无法 加载的情况下引发更易于处理的异常。例如,SLF4J 提供单个 API JAR 文件供其他库编译,但也提供几个不同的实现 JAR 文件供最终应用程序部署(一个委托给 Log4j,一个委托给到 java.util.logging.Logger,等等)。在运行时,SLF4J 会尝试通过动态加载 org.slf4j.impl.StaticLoggerBinder
来找到已部署的实现,但如果找不到,它只会打印一条警告(并且默认为无操作实现)而不是崩溃。如果 SLF4J API JAR 文件中的 classes 静态依赖于 org.slf4j.impl.StaticLoggerBinder
class.