Logo

dev-resources.site

for different kinds of informations.

Custom Annotation

Published at
12/2/2024
Categories
programming
beginners
java
Author
YEJIN LEE
Categories
3 categories in total
programming
open
beginners
open
java
open
Custom Annotation

What is the Custom Annotation?

An annotation is a form of metadata that provides additional information about a program. It can influence how the program is compiled, run, or processed by tools and frameworks.

(metadata: Describe or provide info about
program elements like classes, methods, variables..)

Literally, a custom annotation refers to creating your own annotaion in Java!

How can we make Custom Anotation?

1 - Defining

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "default value";
    int count() default 1;
}

I'll explain KeyComponent like @Retention, @Target later

2 - Using
Applying the Annotation that you made.

public class MyService {
   @MyAnnotation(value = "Hello! 안녕예진!", count = 3) <- !!
   public void myMethod() {
      System.out.println("Excuting myMethod");
   }
}

Accessing Annotation Values.

public class AnnotationProcessor {
   public static void main(String[] args) throws Exception {
     Method method = MyService.class.getMethod("myMethod");

     if (method.isAnnotationPresent(MyAnnotation.class)) {
       MyAnnotation annotation = method.getAnnotation(MyAnnotation.class)

     //Print annotation values
     System.out.println("value: " + annotation.value());
     System.out.println("Count: " + annotation.count());
    }
  }
}

Key Components of Annotations

@Retention

specifies how long the annotation is retained!

  • RetentionPolicy.SOURCE :
    Discarded during compliation.

  • RetentionPolicy.CLASS :
    Retained in the class file but not available at runtime.

  • RetentionPolicy.RUNTIME :
    Available at runtime via reflection.

@Target

specifies where the annotation can be applied.

  • ElementType.TYPE : Classes, interfaces, or enums.

  • ElementType.METHOD : Methods.

  • ElementType.FIELD : Fileds.

Others include PARAMETER, CONSTRUCTOR, etc.

Attributes

  • Attributes in annotation are defined like methods inside the @interface.

  • All attributes in a custom annotation require a value unless a default is provided using default keyword.

  • All attributes must have a return type (String,int ..)

  • All attributes can't have parameters.

When I can use Custom Anotation.

There is a lot. I'll show you one.

1 - Defining

@Constraint(validateBy = NameValidator.class) 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ValidName {
    String message() dafault "Not found username";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] pay() default {};
}

@Constraint is an annotation used in the Bean Validation API. It is applied to define custom validation annotations.
(validateBy = NameValidator.class) means that
the NameValidator class contains the logic to validate the annotated element.

2 - Using
Applying the Annotation that you made.


public class NameValidator implements ConstraintValidator<ValidName, String> {
   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
      return value != ull && value.matches("^[가-힣a-zA-Z]+$"); //permit only Kor or Eng
   }
}
public class UserRequest{
   @ValidName
   private String name;
} 

By using annotations, it became possible to use only Korean and English for names.

Like these, It must improve your code readability and be reusable logic!

Featured ones: