2012-11-18 67 views
3

参数类型不匹配下面是我的代码从我使用反射来调用一个方法,但我总是得到 例外java.lang.IllegalArgumentException异常:在使用反射

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) 

任何建议都会有很大的帮助。

+0

你可以显示方法'PdReader.createPdsxRecordFromUserDO()'?它只有一个参数,相同类型的'userDos'? – Alex

+1

'userDos'的类型是什么?你给了我们无关的信息(你如何获取方法和设置东西),而不是关于你试图调用的方法的*关键*信息以及你调用的方法。 –

+0

抱歉没有发布其他代码。我只是用其他代码更新了这个问题。让我知道是否需要提供其他信息。 – ferhan

回答

4

请检查是否存在名称为“createPdRecordFromUserDO”的多个方法。 看起来有不止一个,但有不同的论点。

您的方法getClassMethod返回它找到的第一个方法,但这可能是错误的。 检查如果methodList.length> 1,那么这是错误的原因。

如果找到具有给定名称的多个方法,请重新考虑您想要执行的操作。

+0

此外,代码看起来有点破解,因为您将方法设置为可访问,最终意味着它是私有的。如果JVM的安全设置设置为高于标准的值,则此行(method.setAccessible(true))可能会失败并显示Exception。 – AlexWien

+0

如果这样不能解决您的问题,并且当methodList.length == 1时,请检查完全限定名的UserCacheDoImpl:都来自同一个包,代码中的com.foo1.UserCacheDoImpl示例,而该方法可能需要一个com.foo2.UserCacheDoImpl。打印出完整限定的参数名(我认为Class.getCanonicalName( )) – AlexWien

相关问题