Java annotation

- 3 mins

Annotation là một dạng metadata trong java để chú thích các class, method, package, biến. Annotation được biên dịch thành bytecode và đọc thông tin bằng cách sử dụng reflection để truy vấn thông tin metadata tương ứng. Trong java, có nhiều loại annotation với các mục đích khác nhau như:

Kí hiệu của annotation bắt đầu bằng @ để đánh dấu cho compiler biết đây là một annotation đang được sử dụng. Đi sau là tên của annotation như Override, Controller,…

Tự tạo một annotation trong java

Để tự khởi tạo một annotation trong java, sử dụng từ khóa @interface để khai báo. Java cung cấp một số annotation có sẵn như @Retention, @Target, @Documented, @Inherited để phục vụ cho việc tự khởi tạo một annotation.

@Retention

Annotation này dùng để chú thích mức độ tồn tại của annotation được tạo. Có 3 mức đánh dấu phạm vi của annotation:

@Target

Annotation này dùng để chú thích cho một annotation khác, để đánh dấu được sử dụng trong phạm vi nào:

@Documented

Đánh dẫu annotation mới này nên được thêm vào tài liệu của java

@Inherited

Annotation có thể được kế thừa từ super class. Khi truy vấn annotation vào lớp con, lớp con không có annotation thì lớp cha của lớp này sẽ được gọi khi sử dụng annotation.

Ví dụ khởi tạo một annotation tên là ExcelColumn để đánh dấu field nào cần xử lý ra một cột khi xuất ra file excel trong một class

Khởi tạo excel column class:

@Documented
@Target(ElementType.FIELD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelColumn {
 
    int index();
 
    String name();
 
    String address() default "Default value";

    String phone();
 
}

Cột address được gán giá trị default nên có thể được bỏ qua khi sử dụng annotation

public class Customer {
 
    @ExcelColumn(index = 1, title = "#", description = "Customer id")
    private long id;
 
    @ExcelColumn(index = 2, title = "Tên")
    private String name;
 
    @ExcelColumn(index = 3, title = "Địa chỉ")
    private int address;
 
    @ExcelColumn(index = 4, title = "Sdt")
    private Date phone;
 
}
comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora