首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,何时以及如何初始化批注?我能控制这个吗?

在Java中,何时以及如何初始化批注?我能控制这个吗?
EN

Stack Overflow用户
提问于 2012-09-05 02:19:05
回答 2查看 1.8K关注 0票数 0

我已经指定了在Java bean验证中使用的自定义注释。我对我的所有字段使用相同的注释类,并传递一个带有字段名称的字符串参数,如下所示:

代码语言:javascript
复制
@CustomConstraint(value="name")
private String name;
@CustomConstraint(value="address1")
private String addressLine1;

我的约束验证器维护一个HashMap,它将字符串键(字段名)映射到我的验证类的接口。我通过将特定字段名与将用于验证字段的接口的具体子类配对来静态初始化此映射,如下所示:

代码语言:javascript
复制
private static final Map<String, CustomValidatorClass> fieldMapper; 

static {
    Map<String, CustomValidatorClass> map = new HashMap<String, CustomValidatorClass>();
    map.put("name", new NameValidator());
    map.put("address1", new Address1Validator());
    fieldMapper = Collections.unmodifiableMap(map);
}

我担心的是这个初始化过程可能非常昂贵(我有几十个字段),并且可能会为我正在验证的每个单独的字段进行初始化。我希望有某种方法来指定注释应该被初始化一次并重用,或者这是默认行为。

编辑:我正在使用JSF2.0和bean-validation,所以我不会直接读取或调用这些注释。这是由框架处理的,这就是为什么我不能确切地确定它是如何操作的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-05 22:30:00

我做了一些测试,似乎只在第一次尝试验证字段时才会调用我在map上执行的静态初始化。这意味着Annotation不会重复初始化,而是在每个字段中重复使用。我对大型初始化开销的担忧现在得到了解决。

票数 0
EN

Stack Overflow用户

发布于 2012-09-05 15:55:00

你的问题不是很清楚,而且你的设计对我来说似乎很奇怪:

  1. 为什么要复制批注中字段的名称?当您在运行时检查注释时,您就知道哪个注释绑定到了哪个字段。你的value似乎是多余的。

@CustomConstraint(value=“字段名称”)

字段类型name-of-field;

  1. 为什么要将字段映射到静态映射中的验证器?您可以使用注释定义此映射:

@CustomConstraint(validator=NameValidator.class)

字段类型name-of-field;

我相信这是大多数基于注解的验证框架的工作方式,例如spring annotation-based validation

编辑

我猜要阅读注释,您必须执行以下操作:

代码语言:javascript
复制
for(Field field : cls.getDeclaredFields()){
 Class type = field.getType();
 String name = field.getName();
 Annotation[] annotations = field.getDeclaredAnnotations();
}

因此,您知道特定注释如何属于特定字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12269229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档