目标是实现一个可以执行.class
已上传文件的方法的 Web 应用程序。上传的类文件以byte[]
. 这个.class
文件中的公共类实现了一个特定的接口。
上传后,我想调用一个方法(接口实现)。
有没有办法在正在运行的 java 应用程序中这样做?如果是,如何?
顺便提一句。我知道安全风险。
目标是实现一个可以执行.class
已上传文件的方法的 Web 应用程序。上传的类文件以byte[]
. 这个.class
文件中的公共类实现了一个特定的接口。
上传后,我想调用一个方法(接口实现)。
有没有办法在正在运行的 java 应用程序中这样做?如果是,如何?
顺便提一句。我知道安全风险。
不应该太难:
ClassLoader#defineClass(String, byte[], int, int)
。YourInterface.class.isAssignableFrom(loadedClass);
)。Class<?>
对您刚刚在步骤 1中获得的内容使用 java 反射/自省。(例如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);
}
}