2016-04-25 3 views
1

私は自分でenumのようなものを実装しようとしていました。私は私の定数オブジェクトを反復しようとしていたが、私は反射を使ってやって来て、java.lang.reflect.Fieldを見つけた。ここに私のシナリオがあります。私は、文字列のペアを保持するためのエンティティ・クラスがインターフェイス内のオブジェクト定数によるリフレクションを使用した反復

public class ConstantEntity { 

    private String constantName; 
    private String constantDesc; 

    ConstantEntity(String name, String desc) { 
     this.constantName = name; 
     this.constantDesc = desc; 
    } 

    public String constantName() { 
     return this.constantName; 
    } 

    public String constantDesc() { 
     return this.constantDesc; 
    } 

} 

定数持っていると私は

public interface MyConstantsPool { 

    public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11"); 
    public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12"); 
    public static final ConstantEntity CONSTANT_THREE = new ConstantEntity("bla3", "13"); 


} 

をエンティティを使用して定数を作成し、私はこれらの定数を通じて消費し、反復処理しようとしているインタフェースを持っています

import java.lang.reflect.Field; 

public class ConsumeConstants { 

    public static void main(String args[]) { 

     Field[] fields = MyConstantsPool.class.getDeclaredFields(); 
     for (int i = 0; i < fields.length; i++) { 

      Object myConstant = fields[i]; 
      ConstantEntity typeSafeEnum = (ConstantEntity) myConstant ; 
      System.out.println(" The name: " 
        + ((ConstantEntity) typeSafeEnum).constantName()); 
      System.out.println(" The description: " 
        + ((ConstantEntity) typeSafeEnum).constantDesc()); 

     } 
    } 
} 

私はドキュメントを読んでいましたが、Fieldの背後にあるアイデアを把握できませんでした。私は反射を使用することの理解に完全に間違っていますか?フィールドはいつ使うのですか?そして、インターフェイスのすべてのObject定数を反復処理する適切な方法は何ですか?

注:私はjava 1.4を使用しています。だから私はこれを実装するために基本的なJavaの機能を使用する必要があります。

答えて

0

Fieldあなたが設定や操作を取得し、また、検査を行うには、実行時に型やフィールドの修飾子を発見するように行うことができますアクセサです。

インターフェイスのすべてのオブジェクト定数を反復処理する適切な方法は何ですか?あなたはすべてのstatic ConstantEntityフィールドを反復処理したい場合は

、あなたはこのようなものを使用することができます

Field[] fields = MyConstantsPool.class.getFields(); 
for (int i = 0; i < fields.length; i++) { 
    Field f = fields[i]; 
    if (ConstantEntity.class.isAssignableFrom(f.getType()) 
      && Modifier.isStatic(f.getModifiers())) { 
     ConstantEntity constant = 
      (ConstantEntity) f.get(null); 
    } 
} 

は、リフレクションを使用しての理解では、私は完全に間違っているのでしょうか?

myConstantを少なくとも部分的に直接ConstantEntityにキャストしようとすると、コードの誤りです。フィールドに保持されている値を実際に取得するには、getに電話する必要があります。 Fieldオブジェクト自体は単なるアクセサーです。

また、実際に、また、Java 1.4を"What is reflection and why is it useful?"


を見ることができます?それは10年以上古いです。あなただけの単純なエラーをした

+2

なぜ落選ですか? – Pshemo

+1

インターフェースは静的ではないフィールドを持つことはできませんので、 'Modifier.isStatic(f.getModifiers()')はおそらく冗長です(あなたの考えを誤解していない限り)。 – Pshemo

+0

@Pshemoはい、私のコード例はちょっとだけ一般的なものです。 – Radiodef

0

Java Reflectionを使用すると、クラスのフィールド(メンバー変数)を検査し、実行時に取得/設定できます。

リフレクションを使用して、そのクラスのフィールドの値を に設定することができます。これは普通の方法で値を設定するときに 特別な状況でのみ行われます。 が可能ではありません。 このようなアクセスは通常、クラスの設計意図 に違反しているため、最大限の裁量で使用する必要があります。

だから、Classオブジェクトは、が保護宣言、宣言した公共用Fieldオブジェクトを取得するために使用される、またはプライベートフィールドを宣言することができます。

しかし、あなたの場合でも、あなたのインタフェースの「設計意図」に役立つ可能性があります。

+0

私は、ドキュメントを通り抜けましたしかし、私はフィールドの背後にあるアイデアを理解できませんでした。私はリフレクションの使用の理解に完全に間違っていますか?フィールドはいつ使用しますか? 私はこの質問を「なぜリフレクションを使うのか、有用なのは何か、目標は何か?」と解釈した。 私は間違っていましたか? – granmirupa

0

反射の代わりに配列を使用するだけの理由はありますか?

public static final ConstantEntity CONSTANT_ONE = new ConstantEntity("bla1", "11"); 
public static final ConstantEntity CONSTANT_TWO = new ConstantEntity("bla2", "12"); 
public static final ConstantEntity CONSTANT_THREE = new ConstantEntity("bla3", "13"); 

public static final ConstantEntity[] CONSTANTS = { 
    CONSTANT_ONE, 
    CONSTANT_TWO, 
    CONSTANT_THREE 
}; 
1

、 あなたは

はあなたがフィールドから値を取得する必要があり、 Fieldつかむと、あなたのクラス ConstantEntityにキャストしようとした:「@Radiodef

Object myConstant = fields[i].get(null); 
関連する問題