目标是实现一个可以执行已上传的.class
个文件的方法的Web应用程序。上传的类文件以byte[]
的形式提供。此.class
文件中的公共类实现了特定的接口
上传后,我想调用一个方法(接口实现)。
有没有办法在正在运行的java应用程序中这样做?如果是,怎么样?
顺便说一下。我知道安全风险。
答案 0 :(得分:6)
不应该太难:
ClassLoader#defineClass(String, byte[], int, int)
加载课程。YourInterface.class.isAssignableFrom(loadedClass);
)。Class<?>
上使用java reflection / introspection。(例如YourInterface obj = (YourInterface)loadedClass.newInstance();
)。obj.shinyMethod();
重新创建自己的类加载器:这是一个只委托给系统类加载器的简单加载器:
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);
}
}