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