Аннотировать методы, чтобы выбрать их позже - PullRequest
1 голос
/ 15 декабря 2011

Можно ли как-то аннотировать 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 ]

3 голосов
/ 15 декабря 2011

Что вы используете?Я не вижу аннотаций, из которых я могу угадать ваши рамки.Если вы используете Hibernate, вы можете использовать что-то вроде @NotNull или что-то еще, или даже сделать свою собственную проверку: Вот как вы бы поступили со своим примером:* Вы также можете создавать свои собственные аннотации без использования каких-либо рамок и использовать их @prepersist или что-то еще.По сути, это предел.

PS Поскольку вы не хотите использовать какой-либо не внутренний код, вот как вы можете подойти:

Сначала вы можете определить аннотацию

@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());
            }
        }
    }
0 голосов
/ 15 декабря 2011

Вы можете использовать универсальный интерфейс

public interface Field {
    public String getValue();
}

и вызывать свой метод проверки с помощью анонимных классов

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

(или со старой Java)

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

Иначе как насчет использования java.lang.Methode напрямую?

PS: Извините за цитату, stackoverflow не позволил мне опубликовать мой текст напрямую, сказал, что он не был правильно отформатирован: - /

0 голосов
/ 15 декабря 2011

Вы можете использовать отражение для этого;см. документацию для java.lang.reflect.Field.Вызывающий может передать имя поля в виде строки, а validateField может использовать что-то вроде Field f = entity.getClass().getField(fieldName).

Но обычно это не очень хорошая идея.,,Отражение - это круто, но оно требует много стандартного кода, и вы платите высокую цену за ремонтопригодность.(Вы также платите штраф за производительность, хотя, по моему опыту, штраф за ремонтопригодность намного хуже, чем штраф за производительность.) Лично я много использую рефлексию в тестовом коде (это может помочь в написании чрезвычайно всеобъемлющих тестов), и я использую фреймворкикак Spring и Hibernate, которые зависят от отражения, но я избегаю этого в моем собственном рабочем коде.

0 голосов
/ 15 декабря 2011

Аннотации не кажутся правильным решением проблемы, которую вы описываете.

Одной из возможностей может быть передача имени поля, которое необходимо проверить, а затем использование класса java.beans.BeanInfo для доступа к значениям поля сущности.Это позволит вам получить доступ к произвольным атрибутам объекта, не сталкиваясь со всей сложностью отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...