注释以后选择它们的方法

时间:2011-12-15 19:49:49

标签: java annotations

是否有可能以这种方式注释Java方法,以后我可以给另一个方法一个字段标识符或类似的东西,以便这个方法可以调用正确的方法?

我知道通常你会用接口做这个,但在我的情况下,这将是一个巨大的接口数...我需要在我的数据库的实体类中使用它(我不允许使用ORM Mapper)

例如:我有实体

public class Account{
    private String username;
    private String password;
    private String name;
    private String mail;


    public void setUserName(String username){
        this.username = username;
    }

    public String getUserName(){
        return username;
    }

    [all other getter/Setter...]
}

现在我想告诉一个方法,它需要验证一个字段,例如username字段。

方法应如下所示:

public void validateField(XXX Field, Entity entity) throws ValidationFailedException, EmptyFieldException;

其中XXX在某种程度上是FieldIdentifier。

在Java中这有可能吗?

我唯一猜到我在那里使用public static final ìnt的东西给每个字段一个方法左右...

4 个答案:

答案 0 :(得分:3)

你用什么?我没有看到任何可以猜测你的框架的注释。如果您使用Hibernate,您可以使用@NotNull之类的东西,甚至可以进行自定义验证: 这就是你的例子:

public class Account{

    @NotNull(message="This field should not be null")
    private String username;
    @NotBlank(message="This string should not be empty or null")
    private String password;
    private String name;
    private String mail;


    public void setUserName(String username){
        this.username = username;
    }

    public String getUserName(){
        return username;
    }

    [all other getter/Setter...]
}

http://silentwalker.wordpress.com/2009/04/07/custom-validation-in-hibernate/

您也可以在不使用任何框架的情况下创建自己的注释,并使用它们@prepersist或其他任何内容。基本上天空是极限。

P.S由于您不想使用任何非内部代码,因此您可以采用以下方法:

首先,您可以定义注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface NotNull{
    public String message() default "";
}

然后,在坚持课程之前,你会检查它的字段:

所以,你有这样的事情:

Field[] classFields = yourObjectPrePersist.getClass().getDeclaredFields();
for (int i = 0; i < classFields.length; i++) {
        classFields[i].setAccessible(true);//take notice that if you use a SecurityManager, you should work around it
        if (classFields[i].getAnnotation(NotNull.class) != null) {
            Object value = classFields[i].get(yourObjectPrePersist);
            //here check if value is null or not and then return the message
            if (value == null) {
                throw new SomeException(((NotNull) classFields[i].getAnnotation(NotNull.class)).message());
            }
        }
    }

答案 1 :(得分:0)

注释似乎不是您描述的问题的正确解决方案。

一种可能性是传递需要验证的字段的名称,然后使用java.beans.BeanInfo类来访问实体的字段值。这将允许您访问对象的任意属性,而无需处理所有反射的复杂性。

答案 2 :(得分:0)

你可以使用反射;见the documentation for java.lang.reflect.Field。调用者可以将字段名称作为字符串传递,validateField可以使用Field f = entity.getClass().getField(fieldName)之类的内容。

但这通常不是一个好主意。 。 。反射很棒,但它需要很多样板代码,而且你需要付出很高的可维护性。 (你也付出了性能损失,但根据我的经验,可维护性惩罚比性能损失要糟糕得多。)我个人在测试代码中使用反射很多(它可以帮助编写非常全面的测试),并且我使用框架比如依赖于反射的Spring和Hibernate,但我在自己的生产代码中避免使用它。

答案 3 :(得分:0)

  

您可以使用通用界面

public interface Field {
    public String getValue();
}
     

并使用匿名类调用您的validate方法

validator.validate(new Field() {
    return account.getUsername()
});
     

(或旧java)

validator.validate(new Field() {
    public String getValue() {
        return account.getUsername();
    }
});

否则直接使用java.lang.Methode呢?

P.S。:对不起这句话,stackoverflow不允许我直接发布我的文字,说它格式不正确: - /