我刚开始玩AspectJ(1.6.11)。我通过commons-email libary发送电子邮件,我想知道发送邮件需要多长时间。这是我的电子邮件发送代码:
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
public class EmailTest
{
public static void main(String[] args) throws EmailException
{
Email e = new SimpleEmail();
e.setHostName("localhost");
e.setFrom("foo@localhost");
e.addTo("batto@localhost");
e.setSubject("Test " + System.currentTimeMillis());
e.setMsg("Message");
e.send();
}
}
这是我的方面:
public aspect EmailAspect
{
private long start;
pointcut conn() : call(* javax.mail.Transport.send(..));
void around() : conn() {
start = System.currentTimeMillis();
Throwable t = null;
try {
proceed();
}
catch(Throwable _t) {
t = _t;
}
long spent = System.currentTimeMillis() - start;
System.out.println("Send time: " + spent);
if (t != null) {
throw new RuntimeException(t);
}
}
}
但是当我用以下代码编译它时:
java -jar ../lib/aspectjtools-1.6.11.jar -cp "$CLASSPATH" -source 6 Email*{java,aj}
我收到以下警告:
/home/batto/work/ajtest/test/EmailAspect.aj:8 [warning] advice defined in EmailAspect has not been applied [Xlint:adviceDidNotMatch]
1 warning
当然,方面不起作用。我尝试过before()/ after()建议,call()中的不同模式,但它们都以相同的警告结束。
我在Eclipse中调试了程序(使用commons-email源),我知道Transport.send()被执行了。
有什么问题?
谢谢。
更新
所以我刚才发现我需要javax.mail.Transport的源代码来处理我使用的编织方法(源代码编织)。所以我使用了二元编织而且它有效。但是我改变了主意,现在我想测量java.net.Socket.connect(..)的时间(org.apache.commons.mail.Email.send(..)调用javax.mail.Transport.send(。 。)调用java.net.Socket.connect(..),我通过Eclipse中的调试验证它。但我不想在我的编译代码中包含整个JDK。所以我尝试了加载时间编织。这是我修改过的方面:
public aspect EmailAspect {
// Some day I'll learn what's the difference between call() and execution()
pointcut conn() :
call(* java.net.Socket.connect(..)) ||
execution(* java.net.Socket.connect(..));
before() : conn() {
System.out.println("It works");
}
}
这个步骤我做了编译&运行程序:
$ mkdir META-INF
$ cat >META-INF/aop.xml
<aspectj>
<aspects>
<aspect name="EmailAspect"/>
<!-- I think this is not neccessary -->
<include within="java..*"/>
<include within="javax..*"/>
</aspects>
<weaver>
<include within="java..*"/>
<include within="javax..*"/>
</weaver>
</aspectj>
$ # add jars from ../lib to CLASSPATH
$ javac -source 6 EmailTest.java
$ java -jar ../lib/aspectjtools-1.6.11.jar -cp ".:$CLASSPATH" -source 6 EmailAspect.aj
$ java -cp ".:$CLASSPATH" -javaagent:../lib/aspectjweaver-1.6.11.jar EmailTest
但它不起作用:(。
答案 0 :(得分:2)
所以我刚刚用加载时编织来解决这个问题。我将aop.xml更改为:
<aspectj>
<aspects>
<aspect name="EmailAspect"/>
</aspects>
<weaver options="-verbose -Xset:weaveJavaxPackages=true -Xset:weaveJavaPackages=true">
</weaver>
</aspectj>
我在这里找到答案https://bugs.eclipse.org/bugs/show_bug.cgi?id=149261#c11(并且AspectJ运行时报告说我需要一直提供-Xset:weaveJavaxPackages = true选项,我太愚蠢了:()。
答案 1 :(得分:0)
快速检查apache文档似乎表明,Email和SimpleEmail都不是Transport的实例。 因此,您可能希望将切入点更改为:
pointcut conn():call(* SimpleEmail.send(..));