来源:
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:toolsaspectJnlibaspectjweaver.jar (on eclipse ide)
如果我尝试编织对system.out.println的调用,它会起作用。但当我尝试Java.net.Socket时,它不会。感谢在这方面的任何帮助。
实际上我编织call(Socket.connect)
没有问题,但execution(Socket.connect)
完全是另一回事,因为
call(Socket.connect)
匹配客户端代码中的连接点,即代码中调用该方法的所有位置execution(Socket.connect)
匹配JDK代码中的连接点,但JDK包java
和javax
默认情况下被排除在编织之外
这似乎是我偶然发现这类问题(或类似问题)的日子,所以你可能想阅读我的答案,了解更多信息。