NỘI DUNG BÀI VIẾT
Annotation trong Java cung cấp thông tin về code. Annotation trong Java không có ảnh hưởng trực tiếp đến code được đánh annotation. Trong hướng dẫn này, chúng ta sẽ xem phần sau;
- Built-in Java annotations
- How to write Custom Annotation
- Annotations usage and how to parse annotations using Reflection API.
Java 1.5 đã giới thiệu các annotation và bây giờ nó được sử dụng nhiều trong các framework Java EE như Hibernate, Jersay và Spring.
Annotation trong Java là siêu dữ liệu về chương trình được nhúng trong chính chương trình. Nó có thể được phân tích cú pháp bằng công cụ phân tích cú pháp chú thích hoặc bằng trình biên dịch. Chúng ta cũng có thể chỉ định tính khả dụng của chú thích cho chỉ thời gian biên dịch hoặc cho đến thời gian chạy.
Trước khi có annotation java, siêu dữ liệu chương trình có sẵn thông qua các bình luận java hoặc bởi Javadoc nhưng chú thích cung cấp nhiều hơn thế. Siêu dữ liệu chú thích cũng có thể có sẵn trong thời gian chạy và trình phân tích cú pháp chú thích có thể sử dụng nó để xác định quy trình.
Java Custom Annotation
Tạo custom annotation tương tự như viết interface, ngoại trừ từ khoá interface được bắt đầu bằng ký hiệu @. Chúng ta có thể khai báo các phương thức trong annotation.
Hãy xem ví dụ về cusom annotation của Java và sau đó chúng ta sẽ thảo luận về các tính năng và điểm quan trọng của nó.
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
String author() default "Pankaj";
String date();
int revision() default 1;
String comments();
}
Code language: CSS (css)
Một số điểm quan tọng về annotation Java là
- Các phương thức chú thích không được có tham số.
- Các kiểu trả về của phương thức chú thích được giới hạn cho các kiểu nguyên thuỷ, String, Enums, Annotation hoặc Mảng.
- Các phương thức chú thích của Java có thể có giá trị mặc định.
- Chú thích có thể có chú thích meta được đính kèm với chúng. Chú thích meta được sử dụng để cung cấp thông ti về chú thích.
Annotation meta trong Java
Có 5 loại chú thích Java
- @Documented – chỉ ra rằng các phần tử sử dụng chú thích này phải được ghi lại bằng javadoc và các công cụ tương tự. Loại này nên được sử dụng để chú thích các khai báo của các loại có chú thích ảnh hưởng đến việc sử dụng các phần tử được chú thích của khách hàng của họ. Nếu một khai báo kiểu được chú thích bằng Documented, thì các chú thích của nó sẽ trở thành một phần của API công khai của các phần tử được chú thích.
- @Target – cho biết các loại phần tử chương trình có thể áp dụng loại chú thích. Một số giá trị có thể có là TYPE, METHOD, CONADING, FIELD, v.v. Nếu không có chú thích meta Target, thì chú thích có thể được sử dụng trên bất kỳ phần tử chương trình nào.
- @Inhe inherit – cho biết rằng một loại chú thích được kế thừa tự động. Nếu người dùng truy vấn kiểu chú thích trên khai báo lớp và khai báo lớp không có chú thích cho kiểu này, thì lớp cha của lớp sẽ tự động được truy vấn cho kiểu chú thích. Quá trình này sẽ được lặp lại cho đến khi tìm thấy chú thích cho loại này hoặc đạt đến đỉnh của cấu trúc phân cấp lớp (Đối tượng).
- @Retention – cho biết thời gian lưu giữ các chú thích với loại chú thích. Nó sử dụng đối số RetentionPolicy có các giá trị Có thể là SOURCE, CLASS và RUNTIME.
- @Repeatable – được sử dụng để chỉ ra rằng kiểu chú thích có khai báo mà nó chú thích là có thể lặp lại.
Built-in annotations in Java
Java cung cấp 5 loại chú thích có sẵn.
- @Override: Khi chúng ta muốn ghi đè một phương thức của Superclass, chúng ta nên sử dụng chú thích này để thông báo cho trình biên dịch rằng chúng ta đang ghi đè một phương thức. Vì vậy, khi phương thức siêu lớp bị loại bỏ hoặc thay đổi, trình biên dịch sẽ hiển thị thông báo lỗi.
- @Deprecated: khi chúng ta muốn trình biên dịch biết rằng một phương thức không được dùng nữa, chúng ta nên sử dụng chú thích này. Java khuyến nghị rằng trong javadoc, chúng tôi nên cung cấp thông tin về lý do tại sao phương pháp này không được dùng nữa và phương pháp thay thế để sử dụng là gì.
- @SuppresWarnings: Điều này chỉ để yêu cầu trình biên dịch bỏ qua các cảnh báo cụ thể mà chúng tạo ra, ví dụ như sử dụng các kiểu thô trong java generics . Chính sách lưu giữ của nó là NGUỒN và nó sẽ bị trình biên dịch loại bỏ.
- @FunctionalInterface: Chú thích này đã được giới thiệu trong Java 8 để chỉ ra rằng giao diện được thiết kế để trở thành một giao diện chức năng .
- @SafeVarargs: Người lập trình khẳng định rằng phần thân của phương thức hoặc hàm tạo được chú thích không thực hiện các hoạt động có khả năng không an toàn đối với tham số varargs của nó.
Ví dụ về Annotation trong Java
Hãy xem một ví dụ java cho thấy việc sử dụng các chú thích dựng sẵn trong java cũng như việc sử dụng chú thích tùy chỉnh do chúng tôi tạo trong ví dụ trên.
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
public class AnnotationExample {
public static void main(String[] args) {
}
@Override
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 1)
public String toString() {
return "Overriden toString method";
}
@Deprecated
@MethodInfo(comments = "deprecated method", date = "Nov 17 2012")
public static void oldMethod() {
System.out.println("old method, don't use it.");
}
@SuppressWarnings({ "unchecked", "deprecation" })
@MethodInfo(author = "Pankaj", comments = "Main method", date = "Nov 17 2012", revision = 10)
public static void genericsTest() throws FileNotFoundException {
List l = new ArrayList();
l.add("abc");
oldMethod();
}
}
Code language: JavaScript (javascript)
Tôi tin rằng ví dụ chú thích java ở trên là tự giải thích và cho thấy việc sử dụng chú thích trong các trường hợp khác nhau.
Phân tích cú pháp chú thích Java
Chúng tôi sẽ sử dụng Reflection để phân tích cú pháp các chú thích java từ một lớp. Xin lưu ý rằng Chính sách lưu giữ chú thích phải là RUNTIME nếu không thông tin của nó sẽ không có sẵn trong thời gian chạy và chúng tôi sẽ không thể tìm nạp bất kỳ dữ liệu nào từ nó.
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationParsing {
public static void main(String[] args) {
try {
for (Method method : AnnotationParsing.class.getClassLoader()
.loadClass(("com.journaldev.annotations.AnnotationExample")).getMethods()) {
// checks if MethodInfo annotation is present for the method
if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
try {
// iterates all the annotations available in the method
for (Annotation anno : method.getDeclaredAnnotations()) {
System.out.println("Annotation in Method '" + method + "' : " + anno);
}
MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
if (methodAnno.revision() == 1) {
System.out.println("Method with revision no 1 = " + method);
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
} catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Code language: JavaScript (javascript)
Output:
Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)
Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)
Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()
Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)
Code language: JavaScript (javascript)
Reflection API rất mạnh mẽ và được sử dụng rộng rãi trong các framework Java, J2EE như Spring, Hibernate, JUnit.
Đó là tất cả cho hướng dẫn ví dụ về chú thích java, tôi hy vọng bạn đã học được điều gì đó từ nó.
Happy learning!!!