Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 如何通过AspectJ中的特权方面编程访问私有成员?_Reflection_Aspectj_Private Members - Fatal编程技术网

Reflection 如何通过AspectJ中的特权方面编程访问私有成员?

Reflection 如何通过AspectJ中的特权方面编程访问私有成员?,reflection,aspectj,private-members,Reflection,Aspectj,Private Members,我想知道在AspectJ中是否可以执行以下操作。我正在向RubyObject类的每个对象添加一个方法.inspect()。该方法应该输出一个类似#的字符串(CompleteClassName,var1=val1,var2=val2,…) 到目前为止还不错,这个.getClass().getFields()得到了我想要的所有可见字段,这个.getClass().getDeclaredFields()加上修饰符.isPrivate(field.getModifiers())给了我一个所有私有字段的列

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

到目前为止还不错,这个.getClass().getFields()得到了我想要的所有可见字段,这个.getClass().getDeclaredFields()加上修饰符.isPrivate(field.getModifiers())给了我一个所有私有字段的列表

这里的问题是,我不能像检索可见字段那样检索privates字段的值。我想这是正常的,因为我使用的反射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;
 }
公共特权方面反映{

private static HashMap我也遇到了同样的问题,看起来它就像更改

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


希望这将有助于他人!

在您的代码中,
字段的类型是什么?
field.setAccessible(true);
result += ", " + field.getName() + "="+ field.get(this);