3

ソース:

package net.andrewewhite.aspects;
import java.util.ArrayList;


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;

@Aspect
public class SocketProfiler {

    @Around("call(* java.net.Socket.connect(..)) || execution(* java.net.Socket.connect(..))")
    public void SocketRead(ProceedingJoinPoint joinPoint) throws Throwable {



         long time=0;
         Object rt=null;
             time= System.nanoTime();
            joinPoint.proceed();

            time=(System.nanoTime()-time)/1000;
            com.profile.Profiler.socketRead.add(time);


        }

}

aop.xml

<aspectj>
<aspects>
    <aspect name="net.andrewewhite.aspects.SocketProfiler"/>
  </aspects>
  <weaver options="-verbose -Xset:weaveJavaxPackages=true -Xset:weaveJavaPackages=true">
  </weaver>
 </aspectj>

VM引数

-javaagent:D:\tools\aspectJn\lib\aspectjweaver.jar  (on eclipse ide)

system.out.println への呼び出しを織り込もうとすると機能します。しかし、Java.net.Socket を試してみると、そうではありません。よろしくお願いします。

4

1 に答える 1

4

実は織りcall(Socket.connect)に問題はありませんが、execution(Socket.connect)まったく別の話です。

  • call(Socket.connect)クライアントコードのジョインポイント、つまり、メソッドが呼び出されるコード内のすべての場所に一致します。
  • execution(Socket.connect)javaJDKコードのジョインポイントに一致しますが、JDKパッケージjavaxはデフォルトでウィービングから除外されます。

この種の質問(または同様の質問)に出くわした日と思われるので、詳細については、あちこちで私の回答を読んでください

于 2012-08-22T13:38:22.897 に答える