AspectJ - 在java.net.Socket上加载时编织麻烦

时间:2012-07-27 05:48:44

标签: java java-ee aspectj

来源:

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 Args

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

如果我尝试编织对system.out.println的调用,它会起作用。但是,当我尝试Java.net.Socket时,它没有。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

实际上我编织call(Socket.connect)没有问题,但execution(Socket.connect)完全是另一个故事,因为

  • call(Socket.connect)匹配客户端代码中的连接点,即代码中调用方法的所有位置,
  • execution(Socket.connect)匹配JDK代码中的连接点,但默认情况下,JDK包javajavax将从编织中排除。

这似乎是我偶然发现此类问题(或类似问题)的日子,因此您可能需要阅读我的答案herethere以获取更多信息。