[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Re: Accessing fields
|
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