2

私は汎用インタープリターを書いています。これには、任意の言語で記述されたソース コードを読み取り、プリミティブをアクティブ化するトランスレータによって実行されるプリミティブ プロセス (メソッド呼び出し、メソッドからのリターン、制御ステートメントなど) が含まれます。このトランスレータのコアは、プロセスとメソッドの動的アクティブ化を実装するメソッドの名前を含む文字列配列から構築されます。

次のコードは、インデックス procIndex が指すメソッドを呼び出すために使用されます。これは私が見つけた例に基づいており、他の例と同じです:

try {
    Class<?> c = Class.forName("FinalTestDecoder");
    Method  commandExe = 
         c.getDeclaredMethod (commandsTable[commandIndex][methodName], (Class<?>[])null);
    commandExe.invoke (commandExe, (Object []) null);
} catch (IllegalAccessException| IllegalArgumentException| 
       InvocationTargetException| EmptyStackException | 
        ClassNotFoundException | NoSuchMethodException | SecurityException  e) { 
  handleErr(cmdMethodNotFound, "Command: "+ commandsTable[commandIndex][programCommand]); 
} finally {
   found = true; 
}   // Cause the loop to terminate

handleErr メソッドはエラー状態を処理し、10 進数のエラー コードと文字列を取得します。エラー ハンドラは、任意の例外によって呼び出すことができます。

問題はClass<?> c = Class.forName("FinalTestDecoder");、ClassNotFoundException をスローする行にあります。これを克服するために、私は 2 つの実験を行いました。最初は、呼び出されたメソッドは呼び出し元のコードと同じクラスにありました。次に、呼び出されたメソッドを含む埋め込みクラスを作成しました。結果は同じでした。

さて、私はこの問題に何時間も費やし、アイデアを使い果たしました。どんな助けでもありがたく歓迎されます

4

1 に答える 1

7

メソッドforNameに必要な完全修飾クラス名を使用する必要があります。このようなもの:-

Class.forName("com.test.class.file.diretory.FinalTestDecoder");
于 2013-03-15T17:20:04.853 に答える