12/08/2018, 13:45

Annotation, sử dụng annotation với reflection trong java

Trong bài viết trước mình có giới thiệu qua về reflection và một số thành phần của nó trong java. Hôm nay, mình sẽ giới thiệu về một thành phần quan trọng của Reflection đó là annotation. (Nếu bạn nào chưa đọc bài viết trước của mình giới thiệu về reflection thì có thể tham khảo tại đây: ...

Trong bài viết trước mình có giới thiệu qua về reflection và một số thành phần của nó trong java. Hôm nay, mình sẽ giới thiệu về một thành phần quan trọng của Reflection đó là annotation. (Nếu bạn nào chưa đọc bài viết trước của mình giới thiệu về reflection thì có thể tham khảo tại đây: https://viblo.asia/p/java-reflection-and-anotation-DbmvmWRMeAg)

1. Annotation

Annotations là một tính năng mới được thêm vào từ java 5. Nó được hiểu là một dạng chú thích hoặc meta data được chèn vào code java để đặc tả dữ liệu cho một đối tượng, giá trị nào đó. Nó có thể được xử lý tại thời điểm compile hoặc tại thời điểm runtime.

Ví dụ về một class annotation

@MyAnnotation(value = "Hello World")
public class TheClass {
}

Lớp TheClass có một annotation @MyAnnotation được ghi lên trên của tên lớp.

Tạo anotation: Annotation được định nghĩa giống như một interface, ví dụ tạo một annotation @MyAnnotation

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)

public @interface MyAnnotation {
    public String value();
}
  • "@" được khai báo trước interface để đánh dấu đó là một annotation, sau khi kháo báo một annotation bạn có thể sử dụng nó trong code của mình như trong ví dụ trên đó với lớp TheClass.

  • @Retention(RetentionPolicy.RUNTIME) và @Target(ElementType.TYPE) xác định cách thức và thời điểm annotation được sử dụng

  • @Retention(RetentionPolicy.RUNTIME): cho biết annotation có thể được truy cập qua reflection tại thời điểm runtime, nếu bạn không khai báo nó khi định nghĩa một annotation bạn sẽ không thể truy cập nó tại thời điểm runtime.

  • @Target(ElementType.TYPE): cho biết việc bạn chỉ có thể sử dụng annotation với class hoặc interface.

2. Truy cập annotation với reflection.

Bạn có thể truy cập annotation của một class, một field, một method tại thời điểm runtime.

a. Class Annotations Truy cập vào class annotation:

Class aClass = TheClass.class;
Annotation[] annotations = aClass.getAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("value: " + myAnnotation.value());
    }
}

Bạn cũng có thể chỉ rõ class annotation mà mình muốn truy cập

Class aClass = TheClass.class;
Annotation annotation = aClass.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("value: " + myAnnotation.value());
}

b. Method Annotations

Truy cập method annotation:

public class TheClass {
  @MyAnnotation(value = "Hello World")
  public void doSomething(){}
}

Method method = ... //obtain method object
Annotation[] annotations = method.getDeclaredAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("value: " + myAnnotation.value());
    }
}

Tuơng tự với class annotation bạn cũng có thể chỉ rõ method annotation:

Method method = ... // obtain method object
Annotation annotation = method.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("value: " + myAnnotation.value());
}

c. Parameter Annotations

Có thể thêm annotations vào trước các khai báo parameter của một hàm.

public class TheClass {
  public static void doSomethingElse(
        @MyAnnotation(value="aValue") String parameter){
  }
}

Và truy cập parameter annotations từ đối tượng của lớp Method

Method method = ... //obtain method object
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
Class[] parameterTypes = method.getParameterTypes();

int i=0;
for(Annotation[] annotations : parameterAnnotations){
  Class parameterType = parameterTypes[i++];

  for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("param: " + parameterType.getName());
        System.out.println("name : " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
  }
}

d. Field Annotations

Ví dụ về một field annotation

public class TheClass {

  @MyAnnotation(name="someName",  value = "Hello World")
  public String myField = null;
}

Truy cập

Field field = ... //obtain field object
Annotation[] annotations = field.getDeclaredAnnotations();

for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("name: " + myAnnotation.name());
        System.out.println("value: " + myAnnotation.value());
    }
}

Cũng có thể chỉ rõ field annotation:

Field field = ... // obtain method object
Annotation annotation = field.getAnnotation(MyAnnotation.class);

if(annotation instanceof MyAnnotation){
    MyAnnotation myAnnotation = (MyAnnotation) annotation;
    System.out.println("name: " + myAnnotation.name());
    System.out.println("value: " + myAnnotation.value());
}

Qua bài viết bạn có thể nắm được việc tạo một annotation và truy cập nó .

references http://tutorials.jenkov.com/java/annotations.html

0