java classloader 分级加载 样例。
CustomClassder 作为 app jar包得加载器, 开启了 并行加载选项。
package com.jsun; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; /** * 自定义classloader */ public class CustomClassder extends URLClassLoader { public CustomClassder(URL[] urls, ClassLoader parent) { super(urls, parent); } public static void register (){ try{ final Method registerParallel = ClassLoader.class.getDeclaredMethod("registerAsParallelCapable"); registerParallel.setAccessible(true); registerParallel.invoke(null); }catch (Exception e){ e.printStackTrace(); } } }
CustomClassder 继承 URLClassLoader , 因此只要再构造函数传入 需要加载得appjar地址就行, 然后第二个参数是 当前线程得classloader,当前为 appclassloader
package com.jsun; import java.io.File; import java.lang.reflect.Method; import java.net.URL; public class test { public static void main(String[] arg)throws Exception{ String jar = "G:\\workspace\\myclassloader\\outjar\\test.jar"; File file = new File(jar); URL url = file.toURI().toURL(); CustomClassder.register(); CustomClassder classder = new CustomClassder(new URL[]{url},Thread.currentThread().getContextClassLoader()); Thread thread = new Thread(new Runnable() { @Override public void run() { runApp(); } }); thread.setContextClassLoader(classder); thread.start(); } public static void runApp (){ try { Class appstartClass = Thread.currentThread().getContextClassLoader().loadClass("com.TestBean"); Object app = appstartClass.newInstance(); Method method = appstartClass.getMethod("appStartRun"); String appRunResult = (String) method.invoke(app,null); System.out.println(appRunResult); } catch (Exception e) { e.printStackTrace(); } } }
CustomClassder.register() 把CustomClassder 注册到并行单粒类ParallelLoaders中,调用
CustomClassder.register() 时当前是 appclassloader, 然后利用 appclassloader得实例 对ParallelLoaders
进行 CustomClassder得注册。 所以当新建 CustomClassder时
private ClassLoader(Void unused, ClassLoader parent) { this.parent = parent; if (ParallelLoaders.isRegistered(this.getClass())) { parallelLockMap = new ConcurrentHashMap<>(); package2certs = new ConcurrentHashMap<>(); domains = Collections.synchronizedSet(new HashSet<ProtectionDomain>()); assertionLock = new Object(); } else { // no finer-grained lock; lock on the classloader instance parallelLockMap = null; package2certs = new Hashtable<>(); domains = new HashSet<>(); assertionLock = this; } }
Classloader中得 ParallelLoaders.isRegistered 便能获取到 CustomClassder.class 因此 CustomClassder成为并行加载器。
相关推荐
在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...
`URLClassLoader`会读取这个JAR文件,并将其包含的类加载到当前运行的Java虚拟机(JVM)中。 在代码中,首先创建了一个`URL`对象,表示JAR文件的路径。接着,通过`URLClassLoader`的构造函数,传入URL数组来实例化...
包括commons-logging commons-beanutils commons-lang ezmorph json-lib-2.4-jdk15 commons-collections-3.2.1的jar包,可以解决 org/apache/commons/lang/exception/NestableRuntimeException的问题
在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...
在Java中,动态加载jar包的核心在于使用`java.lang.ClassLoader`类或其子类。ClassLoader是Java虚拟机(JVM)的一部分,负责将类的字节码加载到JVM中并转换为Class对象。默认情况下,JVM会使用系统类加载器来查找和...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
总之,自定义ClassLoader是Java应用程序中动态加载外部jar包的关键技术。通过理解ClassLoader的工作原理和正确实现加载逻辑,我们可以灵活地扩展应用程序的功能,支持热更新和插件化等高级特性。在阅读和实践"定义...
例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
扩展类加载器(Extension ClassLoader)负责加载 JRE 的扩展目录(JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系统属性指定的)中 JAR 的类包。这为引入除 Java 核心类以外的新功能提供了一个标准机制。扩展类加载...
Java类是从JAR(Java Archive)包中加载的,JAR文件是Java平台特有的归档格式,用于收集多个类文件、相关的元数据和其他资源(如图像文件或配置文件)到一个单一的文件中,方便分发和运行。 首先,我们来理解一下...
在Java编程语言中,类加载器(ClassLoader)是运行时环境的核心组成部分,它负责将类的字节码从各种来源(如JAR文件、网络、内存等)加载到Java虚拟机(JVM)中,使得程序能够运行。本文将深入探讨“使用classloader...
在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...
2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统属性所指定目录中的jar文件。 3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它负责加载用户类...
Bootstrap ClassLoader是JVM启动时的第一个ClassLoader,负责加载JRE的`<JAVA_HOME>/jre/lib`目录下的核心类库,如rt.jar。Extension ClassLoader接着加载`<JAVA_HOME>/jre/lib/ext`目录下的扩展类库。最后,...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
### Java加载.jar包详解 #### 一、Java 类加载机制概览 自 JDK 1.2 版本之后,Java 类加载机制发生了一个重要的变化,引入了一种名为**类加载委托**的概念。这一机制的核心思想在于,如果某个 `ClassLoader` 无法...
在加载流程中,当运行一个程序的时候,JVM 首先启动 bootstrap classloader,该 ClassLoader 加载 Java 核心 API,然后调用 ExtClassLoader 加载扩展 API,最后 AppClassLoader 加载 CLASSPATH 目录下定义的 Class,...
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;