如何通过AspectJ中的特权Aspect以编程方式访问私有成员?

时间:2009-12-02 06:26:34

标签: reflection aspectj private-members

我想知道AspectJ是否可以执行以下操作。我正在为类RubyObject的每个对象添加一个方法.inspect()。该方法应该吐出一个字符串,如#(CompleteClassName,var1 = val1,var2 = val2,...)

到目前为止很好,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;
 }

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,似乎就像改变

一样简单
result += ", " + field.getName() + "=(PRIVATE)"; 

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

希望这会对某人有所帮助!