Skip to main content

[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




Back to the top