0

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;
 }
4

1 に答える 1

1

私は同じ問題を抱えていました、そしてそれは変更するのと同じくらい簡単なようです

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

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

これが誰かを助けることを願っています!

于 2012-04-30T16:18:34.207 に答える