No lucky to get it work in scala.

Here's my java version:

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...");
        }

    }

}


The java version works well ( btw, the jp.getArgs() do return values)


No idea why scala not works.

Is there any work around? any point even before execution I can try?


Thanks

Leon




On Tue, Jun 10, 2014 at 2:05 AM, Alexander Kriegisch <
alexan...@kriegisch.name> wrote:

> >        jp.proceed(text..toUpperCase)
>
> Sorry, typo. I mean text.toUpperCase, and probably you need to wrap that
> into an Object[], i.e.
>
>         jp.proceed(new Object[] { text..toUpperCase })
>
>
>
> Alexander Kriegisch schrieb am 10.06.2014 11:02:
>
> > Hello again, Leon.
> >
> > The Object[] returned by jp.getArgs() will not be passed on to
> jp.proceed().
> > You need to bind the parameter(s) you want to modify via args(), e.g.
> like this
> > (untested, I hope I got the Scala syntax right):
> >
> > @Around("execution (com.leon.aop.MyObject.new(String, ..)) &&
> args(text)")
> > def constructCP(jp: ProceedingJoinPoint, String text): Object = {
> >    try {
> >        println("Start...")
> >        jp.proceed(text..toUpperCase)
> >    } finally {
> >        println("End...")
> >    }
> > }
> >
> > CAVEAT: If you manipulate parameters in subclass constructors this way,
> they
> > will not be passed on to base class constructors via super() calls due
> to the
> > execution order of
> >  - preinitialization(*.new())
> >  - initialization(*.new())
> >  - execution(*.new()).
> >
> > If you really want to catch the former two as well, you need and around()
> > advice on
> >  - call(*.new())
> >
> > For background information see my answer and its sample output on
> > http://stackoverflow.com/a/15571384/1082681.
> >
> > Regards
> > --
> > Alexander Kriegisch
> > http://scrum-master.de
> >
> >
> > Leon Ma schrieb am 10.06.2014 10:10:
> >
> >> I've successfully used round advice to intercept input parameter for a
> method.
> >>
> >>
> >> However, it seems constructor does not work for me. Here're my test:
> (It's in
> >> scala, but should be easy to understand)
> >>
> >>
> >> class MyObjectTest extends FlatSpecLike with Matchers {
> >>
> >>
> >>   "MyObjectAspect" should "work" in {
> >>
> >>     val t = new MyObject("leon")
> >>
> >>     val result = t.talk()
> >>
> >>     println(result)
> >>
> >>     result should be("LEON")
> >>
> >>   }
> >>
> >> }
> >>
> >>
> >> class MyObject(text: String) {
> >>
> >>
> >>   def talk(): String = {
> >>
> >>     println("MyObject " + text)
> >>
> >>     text
> >>
> >>   }
> >>
> >> }
> >>
> >>
> >> @Aspect
> >>
> >> class MyObjectAspect {
> >>
> >>
> >>   @Around(value = "execution (com.leon.aop.MyObject.new(..))")
> >>
> >>   def constructCP(jp: ProceedingJoinPoint): Object = {
> >>
> >>
> >>     try {
> >>
> >>       println("Start...")
> >>
> >>       val args = jp.getArgs
> >>
> >>       args(0) = args(0).toString.toUpperCase
> >>
> >>       jp.proceed(args)
> >>
> >>     } finally {
> >>
> >>       println("End...")
> >>
> >>     }
> >>
> >>
> >>   }
> >>
> >>
> >> }
> >>
> >>
> >> output:
> >>
> >>
> >> Start...
> >>
> >> End...
> >>
> >> MyObject leon
> >>
> >> leon
> >>
> >>
> >> "[leon]" was not equal to "[LEON]"
> >>
> >> org.scalatest.exceptions.TestFailedException: "[leon]" was not equal to
> >> "[LEON]"
> >>
> >> at
> >>
> org.scalatest.MatchersHelper$.newTestFailedException(MatchersHelper.scala:160)
> >>
> >> at
> >>
> org.scalatest.Matchers$ShouldMethodHelper$.shouldMatcher(Matchers.scala:6141)
> >>
> >> at org.scalatest.Matchers$AnyShouldWrapper.should(Matchers.scala:6175)
> >>
> >> at
> com.leon.aop.MyObjectTest$$anonfun$1.apply$mcV$sp(ConstructorTest.scala:18)
> >>
> >>
> >> Anything wrong?
> >>
> >>
> >> Thanks
> >>
> >>
> >> Leon
> >>
> >>
> >
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@eclipse.org
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to