Java 什么是用户定义的类加载器?
我正在阅读关于Jvm体系结构的文章,但我不理解其中的类加载器体系结构。我理解什么是引导类加载器,但不理解用户定义类加载器的工作原理,它在Jvm中是如何工作的,以及为什么需要它 程序员是否编写用户定义的类加载器?我一直在使用java,但没有使用或看不到它何时被使用?请试着用一种简单易懂的方式解释,这样我才能确切地理解它是什么 什么是用户定义的类加载器 用户定义的类加载器是扩展Java 什么是用户定义的类加载器?,java,jvm,Java,Jvm,我正在阅读关于Jvm体系结构的文章,但我不理解其中的类加载器体系结构。我理解什么是引导类加载器,但不理解用户定义类加载器的工作原理,它在Jvm中是如何工作的,以及为什么需要它 程序员是否编写用户定义的类加载器?我一直在使用java,但没有使用或看不到它何时被使用?请试着用一种简单易懂的方式解释,这样我才能确切地理解它是什么 什么是用户定义的类加载器 用户定义的类加载器是扩展Java.lang.classloader或子类的类(不是标准Java库或第三方库提供的) 程序员是否编写用户定义的类加载器
Java.lang.classloader
或子类的类(不是标准Java库或第三方库提供的)
程序员是否编写用户定义的类加载器
对
它在jvm中的工作原理
就像其他类加载器一样。更具体地说,要加载类,它将类文件加载到字节[]
中,然后调用ClassLoader
类实现的defineClass
方法。其他事情可能需要委托给父类加载器
为什么需要它
如果您需要类加载器与普通类加载器的行为不同,则需要使用它。例如,您可能希望转换字节码,或者从标准实现无法处理的地方加载它们。或者,您可能希望实现与普通模式不同的资源加载
请试着用一种简单易懂的方式解释,这样我才能确切地理解它是什么
我建议您阅读这个关于类加载器的IBM教程:它的设计很容易理解,并且包含一个定制类加载器的工作示例。(虽然有点旧,但这不重要。)
或者,有很多选择。。。谷歌会告诉你的
如果您只是想了解一般的类加载器,请阅读:我会尽量保持简单 Java使用类加载器在JVM中加载类。Java能够从文件系统上的二进制文件(*.class文件)或jar文件中的*.class文件加载类 ClassLoader具有“loadClass”功能—它获取类的字符串名称(包含包和所有内容)并返回类—一个描述该对象的类文件。一旦加载,该类就可以在JVM中使用 示例(伪代码):
ClassLoader myCl=。。。
类fooClass=myCl.loadClass(“some.package.Foo”)
你为什么还要担心类加载器呢?通常情况下,您不会真正创建自己的类加载器。不管你什么时候需要它们
比方说,您正在创建应用程序服务器/web服务器。可以在运行时加载应用程序,应用程序不应干扰。在这种情况下,您可能希望实现自己的类加载器,并在自己的类加载器的帮助下加载每个WAR(这基本上就是JBoss、tomcat等中实际发生的情况)
再比如,,
假设您将类定义存储在一些“奇怪”的地方,比如数据库,您可以通过网络获得类定义。在本例中,您将实现获取类定义然后加载的类加载器
最后一个音符。您自己的类加载器不应该自己“加载”类,通常它只负责带来字节流,然后调用其父类的方法进行实际加载(所有类加载器都扩展了java.lang.ClassLoader)
当然,这是一个非常广泛的主题将在这篇文章中涵盖,我只是试图给一个大致的方向开始。您可能应该阅读一些关于类加载器的文档
例如:
希望,这有帮助
ClassLoader myCl = ...
Class<Foo> fooClass = myCl.loadClass("some.package.Foo")