2012-02-20 8 views
2

どのように私も代わりに、親クラスのすべての現在のクラスにのみ関連するフィールドを得ることができますか?のJava - リフレクション:取得現在のクラスに属するフィールドのみ

public class BaseClass() 
{ 
    public int x = 0; 
} 

public class AnotherClass() extends BaseClass 
{ 
    public int y = -1; 
    public int z = -2; 

    public void doStuff() 
    { 
      for(Field f : this.getClass().getFields()) 
      { 
       //Save each field to a file 
      } 
    } 
} 

私はAnotherClassに属するYとZだけを取得したいと考えています。しかし、上記は私にもXを与えます。

これは私が保存したい各値を入力する必要が置き換えることを意図しています。典型的な形式で保存されていません。このように保存しなければならないので、フィールドを別の方法で保存することを推奨しないでください。 200

答えて

7

あなたはそれが継承されたフィールドを除外しますgetDeclaredFields.とクラスで宣言されたフィールドのみを取得することができます。公共Field[] getDeclaredFields()

を使用

+0

それは動作し、それが組み込まれています。 – WildBamaBoy

1

の上にもありますよう

各フィールドの名前をフィルタリングすることがあり、いくつかの機能にフラグでこれを行うためのクリーンな方法であることが、明白な答え(と私は「何もこれの目的を台無しにしてしまいます過去に行われた)は、this.getClass().getFields()super.getClass().getFields()アレイの違いを見つけることです。

2

あなたはFieldgetDeclaredClass()に基づいてフィルタリングすることができます:

public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) { 
    final List<Field> l = new ArrayList<Field>(); 
    for (Field f : c.getFields()) 
     if (f.getDeclaringClass().equals(c)) 
      l.add(f); 
    return l; 
} 

これはあなたの例のためだけyzをピックアップ。

+1

ティー熙。私は、提供されたコードサンプルで 'getDeclaredFields()'をテストし、3つの要素を返すことに気づいたので、間違ったものとして拒否しました。 (はい、それは、ドキュメントを読んよりも簡単です。)しかし、私は内部クラスとしてサンプルコードを貼り付けたのだ、と3番目のフィールドはBaseClass.xではなかった、それはSuperClass.this $ 0基準でした。読む?パ! – FauxFaux

1

は、このオブジェクトが表すクラスまたはインタフェースによって宣言されたすべてのフィールドを反映するFieldオブジェクトの配列を返します。これには、公開、保護、デフォルト(パッケージ)アクセス、およびプライベートフィールドが含まれますが、継承されたフィールドは除外されます。

 Field[] fields = AnotherClass.class.getDeclaredFields(); 
     for(Field f : fields){ 
      System.out.println(f.getName()); 
     } 
関連する問題