在Java中获取对象成员的注释值的简便方法

时间:2016-11-02 15:32:11

标签: java annotations

给定Java中带注释的实例属性,如何获取属性的注释值?即如果对象中有很多BigDecimal属性,你将如何实现下面的getFraction()?

如果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));
}

2 个答案:

答案 0 :(得分: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);
    }
}

注意我正在将字段所在对象的实例和字段名称传递给我的“Util”方法。

它现在可以获得这样的实际值......

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

答案 1 :(得分: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);
    }
}