1

クラス ファイルを編集して、実行時に JVM で使用できるようにしようとしています。それは可能ですか、どうすればできますか?

例えば:

main() {
    for (int i=0;i<10;i++) {
        NewClass.method();
        //ask user if to continue..
    }
}

public class NewClass() {
    static void method() {
        sysout("hi");
    }
}

このループが実行されているときに、ファイル NewClass() を変更して JVM にロードし、「さようなら」を出力したいと考えています。

完全なコードは次のとおりです。

try {
    for (int iCount = 0; iCount < 10; iCount++) {
        BufferedReader br = new BufferedReader(new InputStreamReader(
                System.in));
        System.out.print("Enter which method:");
        int i = Integer.parseInt(br.readLine());
        System.out.println(i);
        if (i == 1) {
            Called.calledMethod1();
        } else {
            Called.calledMethod2();
        }
    }
} catch (NumberFormatException nfe) {
    System.err.println("Invalid Format!");
}

あるクラスのメイン メソッドを実行したいのですが、実行中に別のクラスを参照して編集し、2 番目のクラスの同じメソッドを参照して別の出力を得たいと考えています。

私はしたくない

  1. jvmを停止します
  2. コードを編集する
  3. コードを再度実行します。

したい

  1. 実行時にコードを編集し、変更をすぐに反映させます。
4

1 に答える 1

2

Java リフレクションを使用する必要があります。反射を利用して、

  1. Class forName メソッドを使用して、実行時にクラスを動的にロードします。
  2. 取得したクラスのインスタンスで呼び出しメソッドを使用すると、名前を付けて任意の静的メソッドを呼び出すことができます。

クラスが設計時に固定されている場合は、最初の点をスキップするだけです。いくつかのコード:

...

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter which class:");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
className=br.readLine()
int results = compiler.run(null, null, null, className+".java");
if(results == 0){

    Class clazz = Class.forName(className+".class");
    System.out.print("Compiled successfully.Enter which method:");
    Object returnValue=clazz.getMethod(br.readLine()).invoke(null);
}
...

ただし、セキュリティの問題に注意してください。上記のコードでは、実行時にアクセス可能な各クラスの各静的メソッドを誰でも実行できます。セキュリティが懸念事項の 1 つである場合は、最初にコンソールから受け取った入力を検証し、それらがコンソール経由で使用可能にしたいクラス メソッドの 1 つと一致するかどうかをテストすることをお勧めします。

編集

あなたのコメントを読んだ後、私はあなたの質問をよりよく理解しました。Java 6 をターゲットにしている場合、実行時にクラスをコンパイルするには、Java Compiler objectを使用できます。JavaCompiler の使用を含めるようにコードを編集しました。

于 2012-05-26T19:36:18.273 に答える