1

Java でリフレクションを使用すると問題が発生します。データ構造のメソッドを保存しようとしていますが、エラーが発生します。エラーは

java.lang.NoSuchMethodException: cs671.eval.SerialList.add(java.lang.Integer, java.lang.String)

この場合、取得しようとしているメソッドは、Comparable と Object をパラメーターとして受け取る SerialList の add メソッドです。

structType = "cs671.eval.SerialList"keyType = "java.lang.Integer"、およびvalType = "java.lang.String"は、ファイルから読み込まれた文字列です。

Class dataClass = null, comparableClass = null, objectClass = null;

try{ // create data structure
    dataClass = Class.forName(structType); 
    comparableClass = Class.forName(keyType);
    objectClass = Class.forName(valType);
}
catch(ClassNotFoundException e){}

java.lang.Object structObj = null;

try{ // Create a data structure object
    structObj = dataClass.newInstance();
}
catch(Exception e){}
Method m = null;
try{ // Attempt to get add method for the data structure
    m = dataClass.getMethod("add", comparableClass, objectClass); // This is where it fails
}
catch(Exception e){}

基本的に、そのメソッドに渡される正しいクラスを使用して、正しいデータ構造で正しいメソッドを取得しようとしていますが、getMethod メソッドにそれらのクラス (comparableClass と objectClass) が正しいことを伝える方法がわかりません。もの。

前もって感謝します!

追加: SerialList の add メソッド シグネチャは次のとおりです。 public void add(java.lang.Comparable, java.lang.Object)

4

4 に答える 4

5

あなたが言っています -

この場合、取得しようとしているメソッドは、ComparableObjectをパラメーターとして受け取る SerialList の add メソッドです。

しかし、クラスを渡す - java.lang.Integerjava.lang.String.


注意点 -代わりgetMethod()に使用する必要がある非パブリックに対しては、パブリック メソッドのみが表示されますgetDeclaredMethod()

于 2013-06-21T20:35:14.057 に答える
1

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getMethod%28java.lang.String,%20java.lang.Class...%29から:

クラス C で一致するメソッドを検索するには: C が、指定された名前とまったく同じ仮パラメーターの型を持つパブリック メソッドを 1 つだけ宣言する場合、それが反映されたメソッドです。そのようなメソッドが C に複数あり、これらのメソッドの 1 つが他のどのメソッドよりも具体的な戻り値の型を持っている場合、そのメソッドが反映されます。それ以外の場合は、いずれかの方法が任意に選択されます。

java.lang.Comparable.class=> &を渡す必要があります java.lang.Object.class

于 2013-06-21T20:54:32.607 に答える