2012-08-16 157 views
4

嗨我在運行我的代碼時收到上述錯誤。我無法理解導致錯誤的原因。我已經看到a similar thread上的解決方案,但我不確定這是否適用於我的情況。有人能幫我理解一下嗎?任何幫助是極大的讚賞。異常java.lang.IllegalArgumentException:對象不是在sun上聲明類的實例.reflect.NativeMethodAccessorImpl.invoke0

ERROR

[org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/window].[jsp]] 
Servlet.service() for servlet jsp threw exception 
java.lang.IllegalArgumentException: object is not an instance of 
declaring class  at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597)  at 
com.container.taglib.util.MirrorMaker.invokeMethod(MirrorMaker.java:54) 
    at 
com.container.taglib.util.MirrorMaker.invokeMethod(MirrorMaker.java:48) 
    at 
com.container.taglib.list.TableSorter.invokeMethod(TableSorter.java:1092) 
    at 
com.container.taglib.list.TableSorter.createList(TableSorter.java:503) 
    at 
com.container.taglib.list.TableSorter.doAfterBody(TableSorter.java:151) 

代碼:

public static Object invokeMethod(Object obj, Method method, Object[] params)throws IllegalAccessException, InvocationTargetException{ 
    Object ret = null; 
    String str = ""; 
    try{ 
     ret = method.invoke(obj, params); 
     if(ret instanceof String){ 
      str = (String)ret; 
      //logger.info("ret str: "+str);       
     }else if(ret instanceof Integer){ 
      str = ((Integer)ret).toString(); 
      //logger.info("ret int: "+str); 
     }else if(ret instanceof java.util.Date){ 
      str = new SimpleDateFormat("yyyy-MM-dd").format(ret); 
      logger.info("ret date: "+str); 
     }else if(ret instanceof Double) { 
      str = ((Double)ret).toString(); 
     }else if(ret instanceof ArrayList){ 
      return ret; 
     }else{ 
      return ret; 
     } 

    }catch(IllegalAccessException ex){ 
     logger.info("illegal access"); 
     throw ex; 
    }catch(InvocationTargetException ex){ 
     logger.error("invocation target ex"); 
     throw ex; 
    }   
    return str; 
} 
+0

它看起來像你的對象,因爲obj參數不能調用該方法。嘗試使用method.invoke((Object)null,(Object)null);進行調試。回顧發生了什麼。 – DankMemes 2012-08-16 17:27:16

+0

你說你不確定你鏈接的答案適用於你的案例。你能說爲什麼你認爲它可能不適用? – 2012-08-16 21:28:48

回答

4

沒有理由例外通過嘗試使用反射API使用的對象,它是不是一個調用的方法拋出以外聲明該方法的類的實例。

您從反射API中獲得的錯誤消息並不能幫助您瞭解到底發生了什麼問題。添加一個檢查,如下面給您invokeMethod功能可提供更多有用信息:

if (!Modifier.isStatic(method.getModifiers())) { 
    if (obj == null) { 
     throw new NullPointerException("obj is null"); 
    } else if (!method.getDeclaringClass().isAssignableFrom(obj.getClass())) { 
     throw new IllegalArgumentException(
      "Cannot call method '" + method + "' of class '" + method.getDeclaringClass().getName() 
      + "' using object '" + obj + "' of class '" + obj.getClass().getName() + "' because" 
      + " object '" + obj + "' is not an instance of '" + method.getDeclaringClass().getName() + "'"); 
    } 
} 

此代碼將檢查的對象是聲明方法的類的實例,如果不成功,就拋出與異常關於對象和方法聲明類的更多細節。

看來你的代碼是一個Web應用程序的一部分。我可以推測obj的類和Method的聲明類可能是在兩個單獨的類加載器中加載的同一類的兩個不同副本。 (在Tomcat中,每個Web應用程序都使用它自己的類加載器)。但是,無法看到代碼以及如何運行代碼,這無非是在黑暗中完成一次。

+0

謝謝盧克。我現在得到以下內容:無法通過使用對象'[com。')調用類'com.psc.site.form.ReportForm'的方法'public java.lang.String com.psc.site.form.ReportForm.getPayId()'。因爲對象'[[email protected]]'不是'com.psc.site.form的一個實例',因此類'java.util.ArrayList'的[email protected]] .ReportForm' – 2012-08-22 17:14:07

+1

你發佈的消息說'obj'是一個'ArrayList',而不是'ReportForm'。你不能在'ArrayList'上調用'ReportForm'方法,這就是你得到異常的原因。我還可以從消息中看到該列表包含一個項目。您需要從'ArrayList'中取出這一項並將其傳遞給您的'invokeMethod'方法,而不是將該列表傳遞給'invokeMethod'。 – 2012-08-23 21:39:57

相關問題