首先,您需要将 .class 文件转换为Class
对象。您可以使用URLClassLoader
.
假设您有 aFile classFile
和 a String className
。
try {
URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.toURI().toURL()});
Class<?> clazz = classLoader.loadClass(className);
} catch (Exception e) {
// something went wrong..
e.printStackTrace();
}
现在您将类文件存储在一个Class
对象中,但是如何创建其类型的对象并从中调用方法呢? 包的Java 反射java.lang.reflect
在这种情况下很有用。
假设您将Class<?>
对象存储在名为 的变量clazz
、String methodName
方法名称的 aString toSet
和方法参数的 a 中。
try {
Object instance = clazz.newInstance();
Method method = clazz.getDeclaredMethod(methodName, String.class);
method.setAccessible(true);
method.invoke(instance, toSet);
} catch (Exception e) {
// something went wrong..
e.printStackTrace();
}
请注意,如果方法名称未知,则必须创建一种识别方法,这可以通过反射完成,但通过使用字节码注入/修改/分析库检查方法的字节码更稳定作为ASM或BCEL。虽然 BCEL 自 2006 年以来就没有更新过,但我个人认为它更容易学习如何使用;但是,ASM 要快得多并且是最新的。