类加载器是负责加载类的对象。ClassLoader类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。
每个Class对象都包含一个定义它的ClassLoader的引用。
数组类的Class对象不是由类加载器创建的,而是由Java运行时根据需要自动创建。数组类的类加载器有Class.getClassLoader()返回,该加载器与其元素类型的类加载器是相同的;如果该元素类型是基本类型,则该数组类没有类加载器。
应用程序需要实现ClassLoader的子类,已扩展java虚拟机动态加载类的方式。
类加载器通常由安全管理器使用,用于指示安全域。
ClassLoader类使用使用委托模型来搜索类和资源。每个ClassLoader实例都有相关的父类加载器。需要查找类或资源时,ClassLoader实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为“bootstrap class loader”)本身没有父类加载器,但是可以将它用作ClassLoader实例的父类加载器。
通常情况下,java虚拟机以与平台有关的方式,从本地文件系统加载类。例如,在unix,系统中,虚拟机从classpath环境变量定义的目录中加载类。
然而,有些类可能并非源自一个文件;它们可能源自其它来源(如网络),也可能是由应用程序构造的。difineClass方法将一个byte数组转换为Class类的实例。这种这种新定义的类的实例可以使用Class.newInstance来创建。
例如,应用程序可以创建一个网络类加载器,从服务器中下载类文件。实例代码如下所示:
ClassLoader loader = new NetWorkClassLoader(host,port);
Object main = loader.loadClass("Main",true).newInstance();
网络加载器子类必须定义方法findClass和loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法difineClass来创建类实例。实例实现如下:
class NetWorkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b=loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name){
//load the class data from the connection
...
}
}
分享到:
相关推荐
JDOM是一个用于处理XML文档的Java API,它提供了创建、修改和读取XML文档的功能。SAXBuilder是JDOM中的一个关键类,用于将XML数据解析为JDOM对象模型。 首先,让我们深入了解`ClassNotFoundException`的背景。当...
11. **JVM和类加载器**:`java.lang.ClassLoader`允许自定义类加载机制,而`java.lang.Runtime`提供了与Java虚拟机(JVM)交互的能力。 这份CHM格式的Java API速查手册,通过其详细的类、方法和构造函数描述,为...
Java API文档1.6官方中文版是Java开发者的重要参考资料,它详细阐述了JDK 1.6(也称为Java Development Kit 1.6)中的系统包、类库及其相关接口和方法。对于Java程序员来说,理解和掌握这些API是提高开发效率和编写...
10. **JVM和类加载器**:`java.lang.ClassLoader`允许自定义类加载机制,深入理解JVM的类加载过程对于优化和调试很有帮助。 以上只是Java API的一部分,实际的学习和使用中,还需要结合具体场景去深入理解和实践。...
3. 类加载器:`java.lang.ClassLoader`负责加载类到JVM中,理解其工作原理有助于优化应用性能和解决类冲突问题。 四、安全与权限 1. `java.security.AccessController`和`java.security.AccessControlContext`:...
- **java.lang.ClassLoader(T)**:`java.lang.ClassLoader`类可以被继承,以实现自定义的类加载机制。 #### 2. 类、接口、抽象类的区别 - 类可以继承自另一个类(单继承),同时实现多个接口。 - 接口只能被实现,...
- **`java.lang`包**:这是所有Java程序的基础,包含基本数据类型包装类、`Object`类(所有类的父类)、`String`类以及系统相关的类如`System`和`ClassLoader`。 - **`java.io`包**:提供了输入/输出流相关的类,...
Java反射机制主要依赖于`java.lang.reflect`包下的API,其中包括: - `java.lang.Class`:表示一个类的运行时信息。 - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Field`:表示类的字段。 -...
`javac`编译器的源码可以帮助我们理解这个过程,而`java.lang.ClassLoader`则涉及到了类的加载和执行。 8. **工具类与库**:Java标准库提供了一系列工具类,如`java.util`和`java.text`。通过分析这些类的源码,...
中文版的Java API文档为中国的开发者提供了更易理解的语言环境,帮助他们更好地理解和使用Java平台的功能。 1. **Java API的基础结构** Java API由多个包组成,每个包都包含一组相关的类和接口。例如,`java.lang`...
1. **Java类库**: `rt.jar`中包含了Java API的大部分类和接口,如`java.lang`、`java.util`、`java.io`、`java.net`等包。这些类库提供了基本数据类型操作、字符串处理、集合框架、输入/输出、网络编程、多线程等...
Java API中文文档是Java开发者的重要参考资料,它详细阐述了Java编程语言的核心类库,包括`lang`包中的各种类和接口。`lang`包是Java基础类库的一部分,提供了许多核心功能,对于理解和掌握Java语言至关重要。下面...
`java.lang.ClassLoader` 是一个类,负责加载类。 #### 2. 类与接口的区别 - **一个类只能继承一个父类**,但可以实现多个接口。这是通过使用 `implements` 关键字来实现的,而继承则是通过 `extends` 关键字。 - ...
总结,Jacob为Java开发者提供了一种方便的方式来调用Windows API,解决诸如"java.lang.UnsatisfiedLinkError"这样的问题关键在于正确配置环境和库路径。然而,使用Jacob时也要注意异常处理和性能影响,适时考虑其他...
5. **工具和API**:JDK包含许多实用工具,如`javadoc`用于生成API文档,`jconsole`用于监视JVM性能,`jmap`用于内存映射等。这些工具的源码提供了深入了解Java工具链的机会。 6. **并发编程**:Java的并发库在`java...
10. **类加载器**: java.lang.ClassLoader,负责加载类到JVM。 通过熟练掌握这些API,开发者能够高效地编写出稳定且功能丰富的Java应用程序。同时,随着JDK版本的更新,开发者应关注新版本带来的变化,以便及时更新...
- `java.lang.ClassLoader`: 可以被继承 (`T`)。 2. **抽象类与接口的区别** - 接口支持多重继承,而抽象类只支持单继承。 - 接口中的方法默认为`public abstract`类型,而抽象类中的方法可以具有任何访问级别,...
- **`java.lang`**:这是所有Java程序的基础包,包含了一些基本的数据类型(如`String`、`Integer`)和系统相关的类(如`System`、`ClassLoader`)。 - **`java.io`**:提供输入/输出流处理,如`FileInputStream`...
1. **启动类加载器(Bootstrap ClassLoader)**:负责加载Java核心库(如`java.lang`包下的类)。 2. **扩展类加载器(Extension ClassLoader)**:用于加载`JAVA_HOME/lib/ext`目录中的类库。 3. **应用程序类加载器...
1. 类继承问题:在Java中,`java.lang.Thread`和`java.lang.ClassLoader`是可以被继承的,因为它们没有被声明为final。而`java.lang.Number`、`java.lang.Double`、`java.lang.Math`、`java.lang.Void`和`java.lang....