`

java classloader 分级加载jar

    博客分类:
  • java
阅读更多

 

    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文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

    Java URLClassLoader动态加载jar包1

    `URLClassLoader`会读取这个JAR文件,并将其包含的类加载到当前运行的Java虚拟机(JVM)中。 在代码中,首先创建了一个`URL`对象,表示JAR文件的路径。接着,通过`URLClassLoader`的构造函数,传入URL数组来实例化...

    解决classloader的jar包

    包括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包

    在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...

    动态加载jar包

    在Java中,动态加载jar包的核心在于使用`java.lang.ClassLoader`类或其子类。ClassLoader是Java虚拟机(JVM)的一部分,负责将类的字节码加载到JVM中并转换为Class对象。默认情况下,JVM会使用系统类加载器来查找和...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    定义ClassLoader调用外部jar包

    总之,自定义ClassLoader是Java应用程序中动态加载外部jar包的关键技术。通过理解ClassLoader的工作原理和正确实现加载逻辑,我们可以灵活地扩展应用程序的功能,支持热更新和插件化等高级特性。在阅读和实践"定义...

    springboot+java类热加载

    例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在...

    Java 自动加载JAR文件并运行其中的类方法

    在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    java的ClassLoader类加载器机制

    扩展类加载器(Extension ClassLoader)负责加载 JRE 的扩展目录(JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系统属性指定的)中 JAR 的类包。这为引入除 Java 核心类以外的新功能提供了一个标准机制。扩展类加载...

    java 类从哪个jar包加载的

    Java类是从JAR(Java Archive)包中加载的,JAR文件是Java平台特有的归档格式,用于收集多个类文件、相关的元数据和其他资源(如图像文件或配置文件)到一个单一的文件中,方便分发和运行。 首先,我们来理解一下...

    使用classloader动态加载Class

    在Java编程语言中,类加载器(ClassLoader)是运行时环境的核心组成部分,它负责将类的字节码从各种来源(如JAR文件、网络、内存等)加载到Java虚拟机(JVM)中,使得程序能够运行。本文将深入探讨“使用classloader...

    JAVA动态加载JAR zip包

    在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...

    JAVA ClassLoader 讲解 (类加载器)

    2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统属性所指定目录中的jar文件。 3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它负责加载用户类...

    java classloader

    Bootstrap ClassLoader是JVM启动时的第一个ClassLoader,负责加载JRE的`&lt;JAVA_HOME&gt;/jre/lib`目录下的核心类库,如rt.jar。Extension ClassLoader接着加载`&lt;JAVA_HOME&gt;/jre/lib/ext`目录下的扩展类库。最后,...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java加载。jar包

    ### Java加载.jar包详解 #### 一、Java 类加载机制概览 自 JDK 1.2 版本之后,Java 类加载机制发生了一个重要的变化,引入了一种名为**类加载委托**的概念。这一机制的核心思想在于,如果某个 `ClassLoader` 无法...

    Java ClassLoader学习总结

    在加载流程中,当运行一个程序的时候,JVM 首先启动 bootstrap classloader,该 ClassLoader 加载 Java 核心 API,然后调用 ExtClassLoader 加载扩展 API,最后 AppClassLoader 加载 CLASSPATH 目录下定义的 Class,...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;

Global site tag (gtag.js) - Google Analytics