Как создать пользовательскую аннотацию в java?
Я хочу создать пользовательскую аннотацию в java для DirtyChecking
. Как и я хочу сравнить два строковых значения, используя эту аннотацию, и после сравнения вернет значение boolean
.
Например: я поместил @DirtyCheck("newValue","oldValue")
поверх свойств.
Предположим, что я создал интерфейс:
public @interface DirtyCheck {
String newValue();
String oldValue();
}
Мои вопросы:
- Где я создаю класс для создания метода сравнения для двух строковых значений? Я имею в виду, как эта аннотация уведомляет, что этот метод мне нужно вызвать?
- Как вернуть возвращаемые значения этого метода?
Ответы
Ответ 1
Сначала вам нужно отметить, если аннотация предназначена для класса, поля или метода. Скажем, это для метода: поэтому вы пишете это в своем определении аннотации:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DirtyCheck {
String newValue();
String oldValue();
}
Затем вам нужно написать let say DirtyChecker
class, который будет использовать отражение, чтобы проверить, имеет ли метод аннотацию, и выполнить некоторую работу, например, если oldValue
и newValue
равны:
final class DirtyChecker {
public boolean process(Object instance) {
Class<?> clazz = instance.getClass();
for (Method m : clazz.getDeclaredMethods()) {
if (m.isAnnotationPresent(DirtyCheck.class)) {
DirtyCheck annotation = m.getAnnotation(DirtyCheck.class);
String newVal = annotation.newValue();
String oldVal = annotation.oldValue();
return newVal.equals(oldVal);
}
}
return false;
}
}
Cheers,
Михал
Ответ 2
Чтобы ответить на второй вопрос: ваша аннотация не может вернуть значение. Класс, который обрабатывает вашу аннотацию, может что-то сделать с вашим объектом. Это обычно используется для ведения журнала, например.
Я не уверен, что использование аннотации для проверки, является ли объект грязным, имеет смысл, за исключением того, что вы хотите сделать исключение в этом случае или сообщить какой-то DirtyHandler
.
Для вашего первого вопроса: вы могли бы потратить некоторое время на то, чтобы найти это самостоятельно. Здесь достаточно информации о потоке stackoverflow и в Интернете.
Ответ 3
CustomAnnotation.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
int studentAge() default 21;
String studentName();
String stuAddress();
String stuStream() default "CS";
}
Как использовать поле аннотации в Java?
TestCustomAnnotation.java
package annotations;
import java.lang.reflect.Method;
public class TestCustomAnnotation {
public static void main(String[] args) {
new TestCustomAnnotation().testAnnotation();
}
@CustomAnnotation(
studentName="Rajesh",
stuAddress="Mathura, India"
)
public void testAnnotation() {
try {
Class<? extends TestCustomAnnotation> cls = this.getClass();
Method method = cls.getMethod("testAnnotation");
CustomAnnotation myAnno = method.getAnnotation(CustomAnnotation.class);
System.out.println("Name: "+myAnno.studentName());
System.out.println("Address: "+myAnno.stuAddress());
System.out.println("Age: "+myAnno.studentAge());
System.out.println("Stream: "+myAnno.stuStream());
} catch (NoSuchMethodException e) {
}
}
}
Output:
Name: Rajesh
Address: Mathura, India
Age: 21
Stream: CS
Ссылка