利用ClasserLoader来实现jar包加载并调用里面的方法

news/2024/9/19 14:53:37 标签: 后端, java, classloader

1.ClasserLoader介绍?

classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加载机制,可以快速解决运行时的各种加载问题并快速定位其背后的本质原因,也是解决疑难杂症的利器。因此学好类加载原理也至关重要。

内置类加载器

JVM 中内置了三个重要的 ClassLoader

  1. BootstrapClassLoader(启动类加载器):最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
  2. ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
  3. AppClassLoader(应用程序类加载器):面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展,以满足自己的特殊需求。就比如说,我们可以对 Java 类的字节码( .class 文件)进行加密,加载时再利用自定义的类加载器对其解密。

2.代码工程

实验目标

实现加载外部jar包,并调用其中类方法

JarLoader

package com.et;

import java.net.URL;
import java.net.URLClassLoader;
import java.lang.reflect.Method;
import java.io.File;

public class JarLoader {
    private URLClassLoader urlClassLoader;

    // load JAR file
    public void loadJar(String jarFilePath) throws Exception {
        File jarFile = new File(jarFilePath);
        URL jarUrl = jarFile.toURI().toURL();
        urlClassLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
        System.out.println("JAR Loaded: " + jarFilePath);
    }

    //load class from  JAR and invoke method
    public void invokeClassMethod(String className, String methodName) throws Exception {
        if (urlClassLoader != null) {
            Class<?> loadedClass = urlClassLoader.loadClass(className);
            Method method = loadedClass.getDeclaredMethod(methodName);
            method.invoke(loadedClass.newInstance());
            System.out.println("Method Invoked: " + methodName);
        } else {
            System.out.println("ClassLoader is null, load a JAR first.");
        }
    }

    // unload JAR
    public void unloadJar() throws Exception {
        if (urlClassLoader != null) {
            urlClassLoader.close();  // close ClassLoader
            urlClassLoader = null;    // let it recycle by jvm
            System.out.println("JAR Unloaded.");
        } else {
            System.out.println("No JAR to unload.");
        }
    }
}

service(demo模块)

  • 创建sevice类
  • mvn install 打包成jar包
package com.et.demo.service;

public class MockService implements Service {
    @Override
    public void printVersion() {
        System.out.println("11.0");
    }
}
package com.et.demo.service;

public interface Service {
    void printVersion();
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

3.测试

编写测试类

package com.et;

public class Main {
    public static void main(String[] args) throws Exception {
        JarLoader jarLoader = new JarLoader();

        // load JAR
        jarLoader.loadJar("D:\\IdeaProjects\\Java-demo\\demo\\target\\demo-1.0-SNAPSHOT.jar");

        // invoke the method
        jarLoader.invokeClassMethod("com.et.demo.service.MockService", "printVersion");

        // unload JAR
        jarLoader.unloadJar();
    }
}

启动main方法,查看日志

JAR Loaded: D:\IdeaProjects\Java-demo\demo\target\demo-1.0-SNAPSHOT.jar
11.0
Method Invoked: printVersion
JAR Unloaded.
Disconnected from the target VM, address: '127.0.0.1:53226', transport: 'socket'

Process finished with exit code 0

4.引用

  • ClassLoader (Java Platform SE 7 )
  • 利用ClasserLoader来实现jar包加载并调用里面的方法 | Harries Blog™

http://www.niftyadmin.cn/n/5665737.html

相关文章

开放标准如何破解企业数字化与可持续发展的困境:The Open Group引领生态系统架构创新

应对数字化与可持续发展的双重挑战&#xff0c;开放标准是关键 在当今快速变化的商业环境中&#xff0c;企业不仅需要通过数字化转型提升竞争力&#xff0c;还面临日益严格的可持续发展要求。开放标准正在成为企业破解这一双重挑战的核心工具。The Open Group 2024生态系统架构…

Spring boot从0到1 - day01

前言 Spring 框架作为 Java 领域中最受欢迎的开发框架之一&#xff0c;提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。 学习目标 Spring 基础 Spring框架是什么&#xff1f;Spring IoC与Aop怎么理解&#xff1f; Spring Boot 的快速构建 Spring 基础 学习…

turbo码 交织器的类型

交织器在Turbo码编码过程中起着至关重要的作用&#xff0c;其类型可以根据不同的设计原则和实现方式进行分类。以下是一些常见的交织器类型及其特点&#xff1a; 一、按设计原则分类 确定性交织器&#xff1a; 确定性交织器遵循固定的映射规则&#xff0c;即输入数据的每个位…

重修设计模式-结构型-门面模式

重修设计模式-结构型-门面模式 门面模式为子系统提供一组统一的接口&#xff0c;定义一组高层接口让子系统更易用 门面模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称作外观模式&#xff0c;主要用于为复杂的子系统提供一个统一的、更简洁的接口&#xff0c;使得…

C++学习笔记----7、使用类与对象获得高性能(二)---- 理解对象生命周期(4)

7、拷贝构造函数 在C中有一种叫做拷贝构造函数的特殊的构造函数&#xff0c;它允许生成另一个对象的拷贝的对象。下面是在SpreadsheetCell类中的拷贝构造函数的声明&#xff1a; export class SpreadsheetCell { public:SpreadsheetCell(const SpreadsheetCell& src);// R…

【Java】多态性【主线学习笔记】

文章目录 前言多态性1、编译时多态性&#xff08;静态多态性&#xff09;&#xff1a;2、运行时多态性&#xff08;动态多态性&#xff09;3、多态性的实用性4、多态性的优点与弊端 下一篇点击跳转《【Java】多态性-向下转型【主线学习笔记】》 前言 Java是一门功能强大且广泛应…

功能测试干了三年,快要废了。。。

8年前刚进入到IT行业&#xff0c;到现在学习软件测试的人越来越多&#xff0c;所以在这我想结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业&#xff0c;导致软件测试已经饱和了&#xff0c;想要获得更好的待…

JAVA与Python谁更适合后端?

Java和Python各有优势&#xff0c;选择哪种语言应根据项目的具体需求和团队的实际情况来决定。 小型团队或原型开发&#xff1a;如果项目规模小、需求变动频繁&#xff0c;或者需要快速开发产品原型&#xff0c;建议使用Python。大型项目或企业级应用&#xff1a;如果项目规模…