Java 动态加载 jar 的方法

虽然这是 kotlin 但本质上都一样啦

加载代码

import java.io.File
import java.net.URLClassLoader

object Main {
    @JvmStatic
    fun main(args: Array<String>) {
        val clazzFile = File("test.zip")
        val classLoader = URLClassLoader(arrayOf(clazzFile.toURI().toURL()), URLClassLoader.getSystemClassLoader())
        val clazz = classLoader.loadClass("com.test.Test")
        val instance = clazz.getConstructor().newInstance()
        val method = clazz.getMethod("count", Array<String>::class.java)
        println(method.invoke(instance, arrayOf("1", "2", "3")))
    }
}

Test 类代码

package com.test;

public class Test {
    public int count(String... args) {
        return args == null ? -1 : args.length;
    }
}

运行结果

3

进程已结束,退出代码为 0

基本步骤就是

  1. 使用要加载的 jar 做参数,初始化 URLClassLoader
  2. 使用上一步的 classLoaderloadClass 方法加载要加载的 jar 里的 类
  3. 通过反射调用上一步加载的类里的方法

顺便再记录一下 Kotlin 反射传入可变参数的方法
使用 Array 的泛型就好

Array<String>::class.java
posted @ 2021-08-23 08:14  博麗靈夢  阅读(431)  评论(0编辑  收藏  举报