2009-12-02 6 views
0

AspectJ에서 다음 작업을 수행 할 수 있는지 궁금합니다. RubyObject 클래스의 모든 객체에 .inspect() 메서드를 추가하고 있습니다. 그 메소드는 # (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); 

에 희망이 변경과 같이 간단합니다 보인다 누군가를 도울 것입니다!