4

こんにちは私は私のコードを実行すると上記のエラーを受け取ります。エラーの原因を理解するのに問題があります。私は同様のスレッドで解決策を見てきましたが、これが私の場合に当てはまるかどうかはわかりません。誰かが私がこれを理解するのを手伝ってくれませんか?どんな助けでも大歓迎です。

エラー

[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;
}
4

1 に答える 1

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、2 つの別個のクラスローダーにロードされた同じクラスの 2 つの異なるコピーである可能性があると推測できます。(Tomcat では、各 Web アプリケーションが独自のクラスローダーを使用します。) ただし、コードとその実行方法を確認できなければ、これは暗黒面での完全な突き刺しにすぎません。

于 2012-08-16T21:27:48.440 に答える