2009-12-02 59 views
0

我想知道是否可以在AspectJ中執行以下操作。我將一個方法.inspect()添加到RubyObject類的每個對象中。這個方法應該吐出一個像#(CompleteClassName,var1 = val1,var2 = val2,...)的字符串如何通過程序訪問私有成員通過AspectJ中的特權Aspect?

到目前爲止,this.getClass()。getFields()獲得了我想要的所有可見字段, this.getClass()。getDeclaredFields()加上Modifier.isPrivate(field.getModifiers())給我一個所有私人領域的列表..

這裏的問題是,我無法檢索值私人領域的像我這樣做的可見之一。我想這很正常,因爲我使用的反射API不是AspectJ的一部分,所以他們不知道我在這裏運行所謂的特權方面。

由於我在特權模式下的時候,我可以訪問所有我想用this.privateVariableName私有變量,但我怎麼能做到這一點編程時,變量名本身就是一個變量?

感謝您的幫助..

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

在你的代碼中,Field的類型是什麼? – gulbrandr 2010-09-17 13:52:24

+0

它可以是任何類型。 – matdumsa 2010-09-18 22:19:02

回答

1

我有同樣的問題,而且它似乎是在更換

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

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

希望這麼簡單會幫助別人!