.class
目標は、アップロードされたファイルのメソッドを実行できる Web アプリケーションを実装することです。アップロードされたクラス ファイルは、byte[]
. この.class
ファイルのパブリック クラスは、特定のインターフェイスを実装します。
アップロード後、メソッド(インターフェース実装)を呼び出したいと思います。
実行中のJavaアプリケーションでこれを行う方法はありますか? はいの場合、どのように?
ところで。私はセキュリティリスクを認識しています。
.class
目標は、アップロードされたファイルのメソッドを実行できる Web アプリケーションを実装することです。アップロードされたクラス ファイルは、byte[]
. この.class
ファイルのパブリック クラスは、特定のインターフェイスを実装します。
アップロード後、メソッド(インターフェース実装)を呼び出したいと思います。
実行中のJavaアプリケーションでこれを行う方法はありますか? はいの場合、どのように?
ところで。私はセキュリティリスクを認識しています。
難しすぎてはいけません:
ClassLoader#defineClass(String, byte[], int, int)
ます。YourInterface.class.isAssignableFrom(loadedClass);
)。Class<?>
ます (例: 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);
}
}