2009-12-02 2 views
0

Мне было интересно, можно ли в AspectJ сделать следующее. Я добавляю метод .inspect() к каждому объекту класса RubyObject. Предполагается, что этот метод должен выплюнуть строку типа # (CompleteClassName, var1 = val1, var2 = val2, ...)Практически доступ к частным членам через привилегированный аспект в AspectJ?

До сих пор так хорошо, 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

В вашем коде, какой тип 'Поле'? – gulbrandr

+0

Это может быть любой тип. – matdumsa

ответ

1

Я была такая же проблема, и кажется, что это так просто, как изменение

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

к

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

Надежда на это поможет кому-то!

Смежные вопросы