给定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));
}
答案 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);
}
}