[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Re: Accessing fields
|
To add to Ram's most-excellent code demonstration:
The return type of a field-set join point is (now) void/Void.
The return type of a field-get join point is the same as the field
and contains the value of the field. (You can declare around advice
with a supertype of that type (e.g., Object), but then you are
subject to class-cast exceptions if you replace the return value
with one of the wrong type.)
AFAIK, there is no way to get the present value of a field
at a set join point if you can't bind the defining type or
use reflection.
Wes
Ramnivas Laddad wrote:
Hi Manuel,
Use the following aspect:
aspect GetSetTest {
before(Object field) : set(* *.*)
&& args(field) && !within(GetSetTest) {
System.out.println("Set: " + field);
}
after() returning(Object field) : get(* *.*)
&& !within(GetSetTest) {
System.out.println("Get:" + field);
}
}
The key to remember is get()/set() pointcuts behave much
like call/execution pointcut on equivalent getter/setter methods.
Notice how "after returning" is used to collect the
return value when using get() pointcut (exactly as you
would for pointcuts capturing getter methods).
-Ramnivas
Ramnivas Laddad,
Author, AspectJ in Action
http://www.manning.com/laddad
http://www.amazon.com/exec/obidos/ASIN/1930110936
Check out my aspect-oriented refactoring articles:
http://tinyurl.com/yqm96
http://tinyurl.com/288nn
--- Manuel Menezes de Sequeira <Manuel.Sequeira@xxxxxxxx> wrote:
Hi Miguel,
Thanks for your answer. My problem is, I think, a bit more
complicated. I want to capture all accesses to all instance fields
of a
class or set of classes. Hence, within the around advice, I do not
know:
a) What is the name of the field I'm accessing.
b) What is the possible set of names, since the set of classes to
which
I'm applying the Aspect is open.
I can, of course, obtain the field name using thisJointPoint (e.g.,
thisJoinPointStaticPart.getSignature().getName()). But accessing the
field itself is harder, if at all possible. I tried using Java
reflection, but it (wisely) prohibits access to non-public fields.
The
ideal would be to have some way of exposing the field, just as
target()
exposes the object which contains the field. Is there any obvious
solution to this problem that I'm missing?
Thanks,
Manuel
mmonteiro@xxxxxxxxxxxxxxxxx wrote:
Hi Manuel,
You can access the field by capturing the object that holds it.
Taka look to the following example, which I made while
experimenting
with the pointcut protocol:
README.txt:
---------------------------
This experiment ilustrates how both caller and callee objects can
be captured from a set() pointcut, as well as both old and new
values from the assignement.
The example includes (in class Callee) both a primitive field and
an object field.
Run Caller
------------------------------------------------------------------------
Caller.java:
---------------------------
/*
* Created on 19/Ago/2003
*/
package capture_set;
/**
* @author Miguel Pessoa Monteiro
**/
public class Caller {
private Callee myCallee;
public int myField = 19;
public Caller() {
myCallee = new Callee("Bilbo", 5);
}
public void setName(String newstr) {
myCallee.name = newstr;
}
public void setValue(int newval) {
myCallee.value = newval;
}
public static void main(String[] args) {
Caller caller = new Caller();
caller.setValue(11);
caller.setName("Frodo");
}
}
------------------------------------------------------------------------
Callee.java:
---------------------------
/*
* Created on 19/Ago/2003
*/
package capture_set;
/**
* @author Miguel Pessoa Monteiro
**/
public class Callee {
protected String name;
protected int value;
public Callee(String s, int i) {
name = s;
value = i;
}
}
------------------------------------------------------------------------
---------------------------
/*
* Created on 19/Ago/2003
*/
package capture_set;
/**
* @author Miguel Pessoa Monteiro
**/
public aspect GetContext1 {
pointcut setStr(String str, Callee obj):
set(String Callee.name)
&& withincode(public void Caller.setName(..))
&& target(obj)
&& args(str);
before(String str, Callee obj): setStr(str, obj) {
System.out.print("Old value = \"" + obj.name +"\", ");
System.out.println("new value = \"" + str +"\"");
}
pointcut setInt(int val, Callee obj, Caller caller):
set(int Callee.value)
&& withincode(public void Caller.setValue(..))
&& target(obj)
&& this(caller)
&& args(val);
before(int val, Callee obj, Caller caller):
setInt(val, obj, caller) {
System.out.print("Old value = " + obj.value +", ");
System.out.print("new value = " + val);
System.out.println(" and caller has " + caller.myField);
}
/*
//Reflective implementation:
pointcut reflectiveGetValue(): set(public int field2);
before(): reflectiveGetValue() {
Object[] arguments = thisJoinPoint.getArgs();
System.out.println("thisJoinPoint =\""+thisJoinPoint+"\"");
System.out.println("arguments.length = " +
arguments.length);
Integer valObj = (Integer)arguments[0];
int value = valObj.intValue();
System.out.println("New value = " + value);
}
*/
}
------------------------------------------------------------------------
----Original message:-----
Date: Fri, 23 Jan 2004 19:19:52 +0000
From: Manuel Menezes de Sequeira <Manuel.Sequeira@xxxxxxxx>
Organization: ISCTE
To: aspectj-users@xxxxxxxxxxx
Subject: [aspectj-users] Accessing fields
Reply-To: aspectj-users@xxxxxxxxxxx
I'm using an around advice for set and get pointcuts. Can I have
access
to field being set or got?
Miguel J. T. Pessoa Monteiro
Ph.D. student Minho University,Portugal
eMail: mmonteiro@xxxxxxxxxxxx
URL:http://gec.di.uminho.pt/mpm/
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
--
Manuel Menezes de Sequeira Manuel.Sequeira@xxxxxxxx
Tel: +351(21)7903909 Mobile: +351(96)2337428
Fax: +351(21)7903099 URL: http://home.iscte.pt/~mms/
Yahoo: Manuel_Menezes_de_Sequeira ICQ: 2313850 MSN/AIM: MMSequeira
Gab. D6.18 ISCTE Av. Forças Armadas 1649-026 LISBOA Portugal
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free web site building tool. Try it!
http://webhosting.yahoo.com/ps/sb/
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users