虽然这是 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
基本步骤就是
- 使用要加载的 jar 做参数,初始化
URLClassLoader
- 使用上一步的
classLoader
的loadClass
方法加载要加载的 jar 里的 类 - 通过反射调用上一步加载的类里的方法
顺便再记录一下 Kotlin 反射传入可变参数的方法
使用 Array
的泛型就好
Array<String>::class.java