自定义类加载器继承ClassLoader类,使用自定义类加载器是通过loadClass方法实现。
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // 查找类是否已经加载
Class c = findLoadedClass(name);
if (c == null) {
try { if (parent != null) { //存在父类,先委托父类进行加载
c = parent.loadClass(name, false);
} else { /*没有父类,则委托引导类加载器,委托机制是出于安全考虑,详细可见《深入java虚拟机第二版》,这个loadClass方法没有用到final修饰符,也就是用户可以重载它,不需要用这个委托机制?*/
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) { // findClass自定义加载器会重写这个方法
c = findClass(name);
}
if (resolve) { //对类进行解析
resolveClass(c);
}
return c;
}
上面的finaLoadedClass方法会调用到share/vm/prims/jvm.cpp的JVM_FindLoadedClass方法,
JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)) {
.......
klassOop k = SystemDictionary::find_instance_or_array_klass(klass_name, h_loader, Handle(), CHECK_NULL);
}
上面会调用到
klassOop SystemDictionary::find(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS) {
unsigned int d_hash = dictionary()->compute_hash(class_name, class_loader);
int d_index = dictionary()->hash_to_index(d_hash);
{
No_Safepoint_Verifier nosafepoint;
return dictionary()->find(d_index, d_hash, class_name, class_loader,protection_domain, THREAD);/*这个方法根据类名、类加载器及访问权限来查找这个类是否已经加载,同一个类如果是两个类加载器加载,在虚拟机里面会存在两个对象。*/
}
}
分享到:
相关推荐
在Java编程语言中,类加载器(ClassLoader)是运行时环境...理解类加载机制并正确实现自定义加载器是提升Java应用开发能力的重要一步。在实际项目中,合理利用类加载器可以解决很多复杂问题,比如模块化、动态更新等。
创建自定义类加载器通常需要继承`java.lang.ClassLoader`类,并重写`findClass()`方法。`findClass()`方法会在类加载器中查找指定名称的类的字节码。以下是一个简单的基于磁盘的自定义类加载器示例: ```java ...
- **安全沙箱**:每个加载器都有自己的命名空间,可以通过自定义加载器限制代码访问权限。 - **插件系统**:插件有自己的类加载器,使得插件可以独立于主程序加载和卸载。 在编写`MyClassLoader`时,需要注意的是,...
Java 实现的自定义类加载器示例 Java 实现的自定义类加载器是 Java 语言中的一种机制,允许开发者自定义类加载器,以满足特定的需求。本文将详细介绍 Java 实现的自定义类加载器的原理和实现技巧。 ClassLoader 类...
"Java基于自定义类加载器实现热部署过程解析" Java中基于自定义类加载器实现热部署是指在不重启应用的情况下,当类的定义即字节码文件修改后,能够替换该Class创建的对象。热部署是Java中的一个重要概念,它可以...
此方法会首先尝试调用父类加载器的`loadClass()`,只有当父类加载器无法加载时,才会尝试自己加载。 2. `findClass(String className)`: 查找指定名称的类,返回Class对象。这是自定义加载逻辑的核心方法,需要在...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性...
public Class<?> loadClass(String name)使用指定的二进制名称来加载类,protected final Class<?> findLoadedClass(String name)如果Java虚拟机已将此加载器记录为具有给定二进制名称的某个类的启动加载器则返回该...
自定义类加载器通常需要重写`loadClass`或`findClass`方法。 4. **parent.java** `parent`可能是另一个自定义类加载器,作为`AutoClassLoader`的父类。在`loadClass`方法中,`parent`会被用来尝试先加载类。通过...
- `findClass()`:从Java 1.2开始,自定义类加载器通常只需要重写此方法,当父类加载器找不到类时,此方法会被调用来查找类。 - `defineClass()`:这是一个final方法,用于将字节数组转换为Class对象,实现字节码...
自定义加载器需要重写`findClass()`或`loadClass()`方法。在`MyClassLoader2`示例中,它尝试从指定路径查找类的字节码文件,并通过`defineClass()`方法将字节码转换为Class对象。 ```java public Class<?> find...
通过继承 `java.lang.ClassLoader` 类并重写其关键方法(如 `loadClass()`),我们可以实现自定义的加载策略,例如从网络、数据库或其他非标准位置加载类。这种方式常用于插件系统、热部署等场景,使得程序在运行时...
自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制
自定义类加载器通常继承自`java.lang.ClassLoader`类,重写`loadClass(String name)`方法。在该方法中,开发者可以控制如何查找和加载类。 5. **类加载器与类的关系** 类加载器和类之间存在一对一的关系,不同的类...
创建自定义类加载器通常需要继承`java.lang.ClassLoader`,重写`findClass()`或`loadClass()`方法,从而控制类的查找和加载过程。这使得开发者能够在运行时根据需要加载特定的类,比如从网络、数据库或其他非传统...
通过重写`loadClass()`方法,开发者可以控制类的加载过程,实现特定的加载策略。 **多平台选择性配置**: Java的一个关键优势就是其“一次编写,到处运行”的特性。应用程序类加载器支持在不同操作系统上运行,因为...
- 自定义加载器通常用于隔离加载类、改变加载方式、扩展加载源、防止源码泄露等场景。 - 实现自定义类加载器时,建议在JDK1.2后重写findClass()方法而非loadClass(),以避免复杂的操作。 **常用方法**: - `...
- 创建自定义类加载器实例后,可以使用`loadClass`方法加载类,并通过`newInstance`方法创建类的实例。 - 示例: ```java NetworkClassLoader loader = new NetworkClassLoader("example.com", 8080); Object ...
通过`java.lang.ClassLoader`的`loadClass()`方法,我们可以动态加载类并执行相关操作。反射使得程序在运行时能够动态获取类的信息并进行操作,大大增强了代码的灵活性。 最后,了解类加载器在异常处理中的角色也很...