我尝试使用aspectj拦截scala中的构造函数参数:
class ConstructorTest extends FlatSpecLike with Matchers {
"MyObjectAspect" should "work" in {
val t = new MyObject("leon")
val result = t.talk()
result should be("LEON")
}
}
class MyObject(text: String) {
def talk(): String = {
println(text)
text
}
}
@Aspect
class MyObjectAspect {
@Around(value = "execution (com.leon.aop.MyObject.new(..))")
def constructCP(jp: ProceedingJoinPoint): AnyRef = {
try {
println("Start...")
val args = jp.getArgs
args(0) = args(0).toString.toUpperCase
jp.proceed(args)
} finally {
println("End...")
}
}
}
似乎行不通。
然而,一个非常相似的java版本可以工作:
public class AopTest {
@Test
public void test(){
MyJob t = new MyJob("leon");
String result = t.talk();
System.out.println(result);
Assert.assertEquals(result, "LEON");
}
}
public class MyJob {
private String text;
public MyJob(String value){
text = value;
}
public String talk(){
System.out.println(text);
return text;
}
}
@Aspect
public class MyJobAspect {
@Around(value = "execution (com.leon.aop.MyJob.new(..))")
public Object constructCP(ProceedingJoinPoint jp) throws Throwable {
try {
System.out.println("Start..");
Object[] args = jp.getArgs();
args[0] = args[0].toString().toUpperCase();
return jp.proceed(args);
} finally {
System.out.println("End...");
}
}
}
任何人都可以提供帮助吗?
提前致谢!
莱昂
答案 0 :(得分:0)
我想我之前在AspectJ邮件列表上告诉过你:你需要通过args()
绑定要修改的参数。按照我在ML上告诉你的事情,不要到处问同样的问题。这已经是第二次了。只是忽略了我的建议并再次询问其他地方并不能解决你的问题,只是为愿意帮助你的人创造额外的工作和额外的麻烦。