Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是用户定义的类加载器?_Java_Jvm - Fatal编程技术网

Java 什么是用户定义的类加载器?

Java 什么是用户定义的类加载器?,java,jvm,Java,Jvm,我正在阅读关于Jvm体系结构的文章,但我不理解其中的类加载器体系结构。我理解什么是引导类加载器,但不理解用户定义类加载器的工作原理,它在Jvm中是如何工作的,以及为什么需要它 程序员是否编写用户定义的类加载器?我一直在使用java,但没有使用或看不到它何时被使用?请试着用一种简单易懂的方式解释,这样我才能确切地理解它是什么 什么是用户定义的类加载器 用户定义的类加载器是扩展Java.lang.classloader或子类的类(不是标准Java库或第三方库提供的) 程序员是否编写用户定义的类加载器

我正在阅读关于Jvm体系结构的文章,但我不理解其中的类加载器体系结构。我理解什么是引导类加载器,但不理解用户定义类加载器的工作原理,它在Jvm中是如何工作的,以及为什么需要它

程序员是否编写用户定义的类加载器?我一直在使用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")