目标是实现一个 Web 应用程序,该应用程序可以执行已上传的 .class
文件的方法。上传的类文件以 byte[]
形式提供。此 .class
文件中的公共(public)类实现了特定接口(interface)。
上传后,我想调用一个方法(接口(interface)实现)。
有没有办法在正在运行的 Java 应用程序中这样做?如果是,如何?
顺便说一句。我知道安全风险。
最佳答案
不应该太难:
- 创建您自己的类加载器(不难,见下文)。
- 使用
ClassLoader#defineClass(String, byte[], int, int)
加载类. - 检查它实现了您的接口(interface) (
YourInterface.class.isAssignableFrom(loadedClass);
)。 - 在
Class<?>
上使用 java 反射/自省(introspection)您刚刚进入第 1 步。(例如YourInterface obj = (YourInterface)loadedClass.newInstance();
)。 - 调用方法:
obj.shinyMethod();
重新创建您自己的类加载器:这是一个简单的类加载器,它只委托(delegate)给系统类加载器:
class MyClassLoader extends ClassLoader {
public MyClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
// Our custom public function for loading from a byte array,
// this is here just because defineClass is final, so we
// can't just make it public. Name can be anything you want.
public Class<?> loadClassFromByteArray(byte[] data)
throws ClassFormatError {
return this.defineClass(null, data, 0, data.length);
}
}
关于java - 如何执行已上传的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11262168/