2016-08-28 8 views
0

:私はnullを返したときにCGLibメソッドのインターセプトまたはJDKメソッド呼び出しのreturnオブジェクトの意味は何ですか? CGLIBプロキシの方法インターセプトで

public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { 
    // TODO Auto-generated method stub 
    Performance performance = new Performance(); 
    performance.begin(arg0.getClass().getName() + "." + arg1.getName()); 
    Object result = arg3.invokeSuper(arg0, arg2);//or just arg3.invokeSuper(arg0, arg2); and return null 
    performance.end(); 
    return result; 
} 

とJDKプロキシのinvokeメソッドでは

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    // TODO Auto-generated method stub 
    Performance performance = new Performance(); 
    performance.begin(target.getClass().getName() + ":" + method.getName()); 
    Object obj = method.invoke(target, args);//or just method.invoke(target, args); and return null 
    performance.end(); 
    return obj; 
} 

はしかし、何もchanged.Soは、なぜこれらのメソッドは、戻り値を必要としますか?

答えて

0

呼び出しメソッドをインターセプトしています。結果を変更すると、ロジック動作が変更されます。 重要:元のメソッドがプリミティブ型を返す場合、JDKプロキシからかなりNullPointerExpectionが得られます。

+0

ありがとう、jdkメソッドではNullpointerExpectationをスローしましたが、元のメソッドでintを返そうとするとCGLibは0を返します。 – Lydoo

+0

@Lydooそうです。編集されました。 –

0

これらのインターセプタメソッドからnullを返すと、実際のメソッドがnull以外の値を返した場合でも、プロキシされたクラスでのメソッド呼び出しの戻り値は常にNULLになります。

戻り値はvoidを返すメソッドしかない可能性があるため、nullが返されますが、メソッドに戻り値があるとすぐにコードが破損します。

関連する問題