我正在阅读有关Jvm架构但我无法理解其中的类加载器架构。我理解引导类加载器是什么,但不能理解用户定义的类加载器的工作方式,它是如何工作的jvm以及为什么需要它?
程序员是否编写用户定义的类加载器?我一直在研究java,但没有使用过或者无法看到它何时被使用?请尝试以易于理解的方式解释,以便我能够完全理解它是什么。
答案 0 :(得分:5)
什么是用户定义的类加载器?
用户定义的类加载器是扩展java.lang.Classloader
或子类的类(由标准Java库或第三方库提供)。
程序员是否编写用户定义的类加载器?
是
如何在jvm中运行
就像任何其他类加载器一样。更具体地说,要加载一个类,它会将类文件加载到byte[]
中,然后调用defineClass
类实现的ClassLoader
方法。其他事情可能需要委托给父类加载器。
以及为什么需要它?
如果您需要类加载器与普通类加载器的行为不同,则需要它。例如,您可能希望转换字节码,或从标准实现无法处理的位置加载它们。或者您可能希望以不同于正常模式的方式实现资源加载。
请尝试以易于理解的方式解释,以便我能够完全理解它是什么。
我建议你阅读这篇关于类加载器的IBM教程:http://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html它的设计易于理解,并包含一个自定义类加载器的实例。 (这有点旧,但这不重要。)
或者,有很多替代方案......正如谷歌会告诉你的那样。
如果您只是想了解一般的类加载器,请阅读:What is a Java ClassLoader?
答案 1 :(得分:3)
我会尽量保持简单。
Java使用类加载器在JVM中加载类。 Java能够从文件系统上的二进制文件(* .class文件)加载类,或者在jar文件中加载* .class文件。
ClassLoader是一个具有" loadClass"功能 - 它获取类的字符串名称(包含所有内容)并返回Class - 描述此对象的类文件。加载后,该类可以在JVM中使用。
示例(伪代码):
ClassLoader myCl = ...
Class<Foo> fooClass = myCl.loadClass("some.package.Foo")
为什么你甚至会打扰类加载器?好吧,通常你不会真正创建自己的类加载器。 Hoewever有时你需要他们。
让我们说,您正在创建应用程序服务器/ Web服务器。可以在运行时加载应用程序,应用程序不应该干扰。在这种情况下,您可能希望实现自己的类加载器并在其自己的类加载器的帮助下加载每个WAR(这实际上是在JBoss,tomcat等实际发生的事情)。
另一个例子, 让我们假设你将你的课程定义存储在某些“怪异的”中。地方 - 就像数据库一样,你通过网络获得类定义。在这种情况下,您将实现提取类定义的类加载器,然后加载。
最后一点。你自己的类加载器不应该真正加载&#34;该类本身,通常只负责带来字节流,然后调用其父进程实际加载(所有类加载器扩展java.lang.ClassLoader)。
当然这是一篇非常广泛的主题,我只是试着给出一个大致的指示。您应该阅读一些关于类加载器的文档。
希望,这有帮助