2016-11-02 9 views
-1

Javaの注釈付きインスタンス属性が与えられていると、属性の注釈値をどのように取得できますか?つまり、オブジェクトにBigDecimal属性が多数ある場合は、どのようにgetFraction()を実装しますか?Javaのオブジェクトメンバーの注釈値を取得する簡単な方法

getFraction()がStringパラメータ "amount"を必要としない場合は、属性への参照で十分であり、コードは量属性名のリファクタリングを継承しています。

@Digits(integer=16, fraction=2) 
private BigDecimal amount; 

public void setAmount(double d) 
{ 
    amount = BigDecimal.valueOf(d); 
    amount.setScale(Util.getFraction(amount)); 
} 
+0

属性_はありません。インスタンス変数ごとに 'Field'を作成し、それを使って対応する注釈を取得することができます。私はここにポイントが表示されません。とにかくあなたのソースコードにはハードコードされています。ちょうど2に設定してください。 –

+0

私は、オブジェクト参照の対応するフィールドを実行時に取得できることを期待していましたが、実際には参照の注釈が必要でしたが、できないようです。だから、与えられた解決策は私のために良いです。 – weberjn

+0

annotation.fraction()はintを返します。 また、指定されたBigDecimalでsetScale()を実行することはできません。これらは不変です。setScale()は新しいBigDecimalを返します。 – weberjn

答えて

1

フィールドの注釈を取得することはできません。

"Util"メソッドを呼び出しているときは、それを渡すのはフィールドの値だけです。アノテーションにアクセスするのに十分な情報がありません。ここで

は、私は私の「使用率」メソッドにフィールドが含まれることをオブジェクトのインスタンスとフィールドの名前を渡している

public class SomeClass { 

    @Digits(fraction = 2, integer = 16) 
    private BigDecimal amount; 


    private void setAmount(double d) { 
     amount = BigDecimal.valueOf(d); 

     amount.setScale(Util.getFraction(this, "amount")); 
    } 


    public static void main(String[] args) { 
     new SomeClass().setAmount(12.3); 
    } 
} 

お知らせ...あなたはそれを行う可能性がある方法です。

それは今

public class Util { 

    public static int getFraction(Object obj, String fieldName) { 
     try { 
      Digits annotation = obj.getClass().getDeclaredField(fieldName).getAnnotation(Digits.class); 
      return annotation.fraction(); 
     } catch (NoSuchFieldException | SecurityException e) { 
      // BOOM! 
      throw new IllegalStateException("Something went awfully wrong...", e); 
     } 
    } 
} 
+0

'@Retention(RetentionPolicy.RUNTIME)'をアノテーションに追加することを忘れないでください。そうでなければ、実行時には利用できなくなります... – BretC

1

注釈値は、クラス自体に限定され、それはそれはすべてのインスタンスで同じになりますFieldから来ていない...このような実際の値を得ることができますクラスの

例を示します。

package com.mypackage; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.reflect.Field; 
import java.math.BigDecimal; 

public class TestAnnotation { 

    @Retention(RetentionPolicy.RUNTIME) 
    @interface Digits { 
     public int integer() default 0; 
     public double fraction() default 0.0; 
    } 

    public static class TestClass {  
     @Digits(integer=16, fraction=2) 
     private BigDecimal amount; 
    } 

    public static class Util { 
     public static double getFractionFromObject (Class<TestClass> klass) { 
      double fraction = 0.0; 
      try { 
       Field amountField = klass.getDeclaredField("amount"); 

       Digits annotation = amountField.getAnnotation(Digits.class); 
       fraction = annotation.fraction(); 
      } catch (NoSuchFieldException e) { 
       e.printStackTrace(); 
      } catch (SecurityException e) { 
       e.printStackTrace(); 
      } 
      return fraction; 
     } 
    } 
    public static void main(String[] args) { 
     double fraction = Util.getFractionFromObject(TestClass.class); 

     System.out.println("Fraction is : " + fraction); 
    } 
}