我想知道是否可以在 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;
}