Scan toàn bộ annotation trong các class Java
Java
68
White

Ngoc Dao viết ngày 20/03/2016

Để bớt phải cấu hình bằng XML vừa rườm rà vừa không type-safe (đi ngược lại tinh thần của các ngôn ngữ tĩnh là kiểm tra kiểu chặt chẽ để tránh bug và dễ maintain/refector khi viết chương trình lớn), các thư viện/framework Java hiện đại đều có xu hướng dùng annotation.

Vấn đề chung của phong cách này là khi chạy (thường là khi khởi động) phải làm sao scan qua toàn bộ các class để trích ra metadata có ích. Nói cách khác, phong cách dùng annotation để cấu hình có nguyên lí chung là: (1) cấu hình được viết phân tán rải rác ngay trong source code (chứ không tập trung ở một vài tập tin XML), (2) khi chạy, thư viện/framework liên quan phải tự gom tất cả mọi chỗ cấu hình lại một chỗ (trong bộ nhớ). Về mặt triết lí, phong cách này cho phép hệ thống dễ mở rộng hơn, modular hơn, bớt monolithic hơn. Nhưng ngược lại source code có nhiều lát cắt hơn (aspect oriented), cái đầu của bạn khi đọc source code phải chạy thêm vài luồng tư duy song song, nên khi bắt đầu làm quen với phong cách mới này bạn sẽ hơi bị choáng. Hi vọng cái choáng này có tác dụng chống lão hoá não bộ, ngăn cản bệnh Alzheimer.

Bài viết này giới thiệu thư viện Annovention giúp giải quyết vấn đề trên. Nếu dùng Scala, hãy tìm hiểu thư viện khác là Sclasner cũng do tác giả bài này viết.

Đặc điểm

Điểm đặc sắc thứ nhất của Annovention là rất nhỏ gọn, chỉ dùng duy nhất thư viện Javassist. Ví dụ cùng thể loại có thư viện khá nổi là Reflections, nhưng xem phần dependencies trong pom.xml của nó sẽ thấy nó dùng khá nhiều thư viện. Các thư viện này tiếp đó có thể lại dùng thêm các thư viện khác, nên nếu dùng Reflections chương trình của bạn phải gánh thêm cả tá thư viện, chạy tốn bộ nhớ, nhất là chẳng may chúng đụng độ phiên bản với thư viện nào đó có sẵn trong chương trình của bạn thì rất phiền toái.

Điểm đặc sắc thứ hai là ví dụ để scan tất cả annotation trong class X, Annovention không phải load vĩnh viễn tập tin X.class vào JVM, mà chỉ load tạm rồi dùng Javassist để kiểm tra bytecode trong X.class, kiểm tra xong bộ nhớ sẽ được giải phóng.

Cách dùng

Nên dùng bản trên Github. Còn hướng dẫn xin xem trên Google Code.

Tổng quan, có 3 bước:

  1. Dùng Annovention để biết annotation mình cần lấy thông tin nằm ở class, method, field tên là gì.
  2. Dùng Class.forName để load class dựa vào tên ở bước 1, thu được instance của Class.
  3. Dùng các hàm có trong Class để móc ra metadata cụ thể trong annotation.

Web framework S3m dùng thư viện này.

Liệt kê tất cả thành phần trong classpath

Đoạn xử lí đặc sắc nhất trong Annovention có lẽ là đoạn liệt kê tất cả thành phần trong classpath. Đoạn mã này đáng được trình bày ở đây.

Nếu chỉ đơn giản là lấy System.getProperty("java.class.path"), thì bạn sẽ không lấy được toàn bộ tất cả thành phần JVM thực sự load khi chạy đâu. Phải làm như sau:

URL[] getUrlsForCurrentClasspath() {
List<URL> list = new ArrayList<URL>();

ClassLoader loader = Thread.currentThread().getContextClassLoader();
while (loader != null) {
if (loader instanceof URLClassLoader) {
URL[] urlArray = ((URLClassLoader) loader).getURLs();
List<URL> urlList = Arrays.asList(urlArray);
list.addAll(urlList);
}
loader = loader.getParent();
}
return list.toArray(new URL[list.size()]);
}
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
252 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
56 6
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết gần 2 năm trước
56 6
White
32 0
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết gần 2 năm trước
32 0
White
28 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết gần 2 năm trước
28 1
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết hơn 2 năm trước
0 0
Male avatar
8 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết hơn 1 năm trước
8 5
White
0 2
(Link), mình đã nêu ra các phần mềm chính (portal, sdk và ide). Trong phần này, mình sẽ hướng dẫn cụ thể cài đặt môi trường máy chủ và môi trường l...
programmerit viết hơn 2 năm trước
0 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
252 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!