2009-12-02 18 views
0

Je me demandais s'il était possible dans AspectJ de faire ce qui suit. J'ajoute une méthode .inspect() à chaque objet de la classe RubyObject. Cette méthode est censée cracher une chaîne comme # (CompleteClassName, var1 = val1, var2 = val2, ...)Comment accéder par programmation aux membres privés via Aspect privilégié dans AspectJ?

Jusqu'ici tout va bien, this.getClass(). GetFields() m'obtient tous les champs visibles que je veux et this.getClass(). getDeclaredFields() couplé à Modifier.isPrivate (field.getModifiers())) me donne une liste de tous les champs privés ..

Problème ici est que je ne suis pas en mesure de récupérer la valeur des champs privés comme je le fais avec le visible. Je suppose que c'est normal puisque l'API réfléchie que j'utilise ne fait pas partie d'AspectJ, donc ils ne sont pas conscients que j'utilise un aspect dit privilégié ici. Comme je suis en mode privilégié, je peux accéder à toutes les variables privées que je veux en utilisant this.privateVariableName mais comment puis-je le faire par programmation quand le nom de la variable est lui-même dans une variable?

Merci pour votre aide ..

public privileged aspect Reflect { 
private static HashMap<Class<? extends Object>,ArrayList<RubyObject>> oStore = new HashMap<Class<? extends Object>, ArrayList<RubyObject>>(); 

private boolean RubyObject.hasBeenImported = false; 
declare parents: ca.concordia.* implements RubyObject; 


//inspect return a string of the format #<classname, var1=val, var2=val, ...> 
//Unfortunately, it doesn't get PRIVATE data since privileged aspect can't gelp with field.get(Object) 
public String RubyObject.inspect() 
{ String result = "#<" + this.getClass().getName(); 
    for (Field field : this.getClass().getFields()) 
    { 
    try { result += ", " + field.getName() + "=" + field.get(this); } 
    catch(Exception e) { result += ", " + field.getName() + "=(???)"; } //should never occur; 
    } 
    for (Field field : this.getClass().getDeclaredFields()) 
    { if (Modifier.isPrivate(field.getModifiers())) 
    result += ", " + field.getName() + "=(PRIVATE)"; 
    } 
    result += ">"; 
    return result; 
} 
+0

Dans votre code, quel est le type de 'Field'? – gulbrandr

+0

Il peut être de n'importe quel type. – matdumsa

Répondre

1

J'ai eu le même problème, et il semble que c'est aussi simple que de changer le

result += ", " + field.getName() + "=(PRIVATE)"; 

à

field.setAccessible(true); 
result += ", " + field.getName() + "="+ field.get(this); 

Hope this aidera quelqu'un!