Re: AspectJ modify property field content or add and/or change method
body in a runtime instance
Jimmy wrote:
It is possible to access data member of a Java class with pointcut,
but I need to do a field assignment or even hijack/override the method
with a custom implement with AspectJ. Can someone refer me to some
sample code URL and/or tutorial for doing so?
Yes.
Demo:
public class Foobar
{
private int v;
public int getV() {
return v;
}
public void setV(int v) {
this.v = v;
}
public void test() {
System.out.println("test: v=" + v);
v++;
System.out.println("test: v=" + v);
}
public static void main(String[] args) {
Foobar o = new Foobar();
o.setV(7);
System.out.println("main: v=" + o.getV());
o.test();
System.out.println("main: v=" + o.getV());
}
}
import java.lang.reflect.*;
import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;
@Aspect
public class Fun {
@Pointcut("call(public void Foobar.test())")
public void foobarTest() { };
@Before("foobarTest()")
public void before(JoinPoint tjp) {
// increment v
Foobar o = (Foobar)tjp.getTarget();
o.setV(o.getV() + 1);
}
@Around(value = "foobarTest()")
public Object around(ProceedingJoinPoint pjp) {
// call twice instead of once
pjp.proceed();
pjp.proceed();
return null;
}
@AfterReturning("foobarTest()")
public void after(JoinPoint tjp) {
// increment v
Foobar o = (Foobar)tjp.getTarget();
o.setV(o.getV() + 1);
}
}
C:\>javac Foobar.java
C:\>java Foobar
main: v=7
test: v=7
test: v=8
main: v=8
C:\>ajc -source 1.5 Foobar.java Fun.aj
C:\>java Foobar
main: v=7
test: v=8
test: v=9
test: v=9
test: v=10
main: v=11
Arne