AspectJ:scala中的intercept构造函数

时间:2014-06-10 16:34:53

标签: scala constructor aspectj

我尝试使用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...");
        }

    }

}

任何人都可以提供帮助吗?

提前致谢!

莱昂

1 个答案:

答案 0 :(得分:0)

我想我之前在AspectJ邮件列表上告诉过你:你需要通过args()绑定要修改的参数。按照我在ML上告诉你的事情,不要到处问同样的问题。这已经是第二次了。只是忽略了我的建议并再次询问其他地方并不能解决你的问题,只是为愿意帮助你的人创造额外的工作和额外的麻烦。