Java中的类加载器到底是什么?

Java中的类加载器到底是什么?,java,classloader,Java,Classloader,当客户机在Java中说“代码不应该有自定义类加载器”时,这到底是什么意思?我不能做什么?类加载器是Java中的一个对象,负责查找Java类的二进制表示并将它们加载到JVM中。所有JVM都从一个引导类加载器开始,该加载器负责加载用户的初始类,以及一些内置类型,如class和SecurityManager,但是用户可以提供自己的类加载器来从其他源查找类。例如,自定义类装入器可以通过编写自己的字节码来生成自己的类,也可以从网络源中查找类 为了满足客户机的要求,您不应该定义自己的类加载器,而应该依靠引导

当客户机在Java中说“代码不应该有自定义类加载器”时,这到底是什么意思?我不能做什么?

类加载器是Java中的一个对象,负责查找Java类的二进制表示并将它们加载到JVM中。所有JVM都从一个引导类加载器开始,该加载器负责加载用户的初始类,以及一些内置类型,如
class
SecurityManager
,但是用户可以提供自己的类加载器来从其他源查找类。例如,自定义类装入器可以通过编写自己的字节码来生成自己的类,也可以从网络源中查找类


为了满足客户机的要求,您不应该定义自己的类加载器,而应该依靠引导类加载器来查找所有类。这几乎是在简单Java程序中所做的,因为定制引导加载程序的用例通常相当复杂和微妙。除非您特别想更改JVM查找和加载类的方式,否则不必担心这个限制。

自定义类加载器通常用于动态生成代码或增强现有类

例如,一些ORM实现(JDO)使用它来创建处理将Java对象转换为数据库表的代码。另一个用途是在透明集群解决方案(如Terracota)中,在该解决方案中,对象被增强,以便它们在集群中自动复制自己


这基本上防止您动态生成代码并将代码注入现有应用程序。

类加载器是负责加载类的对象。每当您使用
new
实例化一个类时,运行时系统都会尝试使用ClassLoader抽象类的一个或多个实例加载该类。您可以定义自定义类装入器,从网络、数据库、其他进程或任何可能的数据源装入类


所以,如果您的客户不希望您使用自定义类加载器,那么请确保永远不要编写扩展类加载器或其任何派生类的类。有关更多详细信息,请参阅java API文档。

自定义类加载器可以让您从非常规源加载类(从您可以想象的任何地方,包括凭空创建的类)。既然您的客户机说要提供该消息,那么类只能从标准源(例如文件系统、jar文件等)加载。

所以如果我坚持使用Spring框架,不做任何不寻常的事情,我就可以了?