1. ホーム
  2. java

[解決済み] java.lang.IllegalArgumentException: Reflection 使用時の引数の型の不一致

2022-02-12 01:50:48

質問

以下は私のコードで、リフレクションを使ってメソッドを呼び出していますが、いつも次のような問題が発生します。 例外

List<PdAttrKey> attrKeys = new ArrayList<PdAttrKey>();
Properties adapterProps = new Properties();

PdReadRequest pdReadRequest = new PdReadRequest(1L, 1L, (short) 0, new Date(),
dataDurationSec, 2L, 3L, attrKeys, null, adapterProps);

PdAdapterUserReadOnlyGemsReader adapter1 = new PdAdapterUserReadOnlyGemsReader();

PdReader reader = adapter1.acquireReader(pdReadRequest);

UserCacheDoImpl userDos = Some Value;

Method method = getClassMethod("createPdRecordFromUserDO");

// This line is throwing me exception. And I don't know why?
PdRecord onePdsxRecord = (PdRecord) method.invoke(reader, userDos);

これは、あるクラスのすべてのメソッド名を取得する以下のメソッドです。

    private Method getClassMethod(String methodName) {
        Method method = null;

        Method[] methodList = PdAdapterUserReadOnlyGemsReader.PdUserReadOnlyGemsReader.class
                .getDeclaredMethods();
        for (Method m : methodList) {
            if (m.getName().equals(methodName)) {
                method = m;
                method.setAccessible(true);
                break;
            }
        }

        return method;
    }

その他のコード:-)

private PdRecord createPdRecordFromUserDO(UserCacheDoImpl userCache) {
   // Some code here
}

これは、私が得ている例外です。何か心当たりはありますか?

java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:599)

何かご指摘があれば、大変助かります。

解決方法は?

createPdRecordFromUserDO"という名前のメソッドが複数存在しないか確認してください。 複数のメソッドが存在するように見えますが、引数が異なっています。

getClassMethod メソッドは最初に見つかったメソッドを返しますが、それは間違ったメソッドである可能性があります。 methodList.length > が1であれば、これがバグの原因であることを確認してください。

指定した名前のメソッドが複数見つかった場合にどうしたいかを再考してください。