2

.class目標は、アップロードされたファイルのメソッドを実行できる Web アプリケーションを実装することです。アップロードされたクラス ファイルは、byte[]. この.classファイルのパブリック クラスは、特定のインターフェイスを実装します。
アップロード後、メソッド(インターフェース実装)を呼び出したいと思います。

実行中のJavaアプリケーションでこれを行う方法はありますか? はいの場合、どのように?

ところで。私はセキュリティリスクを認識しています。

4

1 に答える 1

6

難しすぎてはいけません:

  1. 独自のクラスローダーを作成します (難しいことではありません。以下を参照してください)。
  2. を使用してクラスをロードしClassLoader#defineClass(String, byte[], int, int)ます。
  3. インターフェイスが実装されていることを確認します ( YourInterface.class.isAssignableFrom(loadedClass);)。
  4. ステップ 1 で取得した で Java リフレクション/イントロスペクションを使用しClass<?>ます (例: YourInterface obj = (YourInterface)loadedClass.newInstance();)。
  5. メソッドを呼び出します。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);
    }
}
于 2012-06-29T12:57:41.590 に答える