【发布时间】:2014-07-18 12:36:28
【问题描述】:
我需要在验证注册器对象中注册字段以供以后验证,它是这样的;
public class ValidationRegisterer{
public void register(String spElPath, Validator validator){
//puts spElPath and the related validator into a collection...
}
}
假设我有一个 A 类;
public class A {
private String name;
public String getName(){
return this.name;
}
}
我想验证 A 对象的名称字段,然后我正在注册一个这样的验证器;
validationRegisterer.register("name", MandatoryFieldValidator.class);
validationRegisterer 已设置为使用 A 类作为根,因此它知道它应该查找 A 类以获取“名称”。为了检索值和注册验证器,我使用 Spring Expression Language (SpEl)。
但我不想在此示例中硬编码像“name”这样的字段名称,因为有人可以在不更改注册路径的情况下进行重构并更改字段名称,并且在发生运行时异常之前我们无法检测到这一点。有没有办法存储类的字段名称和方法的引用,例如 Hibernate Metadata Generated classes?
【问题讨论】:
-
我相信你正在寻找这个:docs.oracle.com/javase/tutorial/reflect
-
private字段是私有的是有原因的。您不应该在外部类中验证它们。最好对访问器方法进行验证——它们的名称,作为公共合同,不太可能被更改 -
反思可以帮助你。
-
实际上,对于 SpEl,我使用的是访问器方法,而不是直接使用字段值。当我使用“名称”作为 SpEl 表达式时,会调用 getName 方法。我不知道反射如何帮助我。我不想硬编码字段名称,并且使用反射我认为如果不硬编码字段名称就不可能知道要注册哪个验证器。