2015-06-12 13 views
5

Làm cách nào để có được tất cả các lớp bằng cách sử dụng mẫu như "com.stackoverflow. *" Với Javassist?Bắt tất cả các lớp học với Javassist bằng cách sử dụng mẫu

tôi tìm thấy chỉ có 2 phương pháp:

1/Tìm một lớp học bằng cách ghi rõ họ tên

CtClass ClassPool.getDefault().getCtClass("com.stackoverflow.user.name") 

2/Tìm một danh sách các lớp học với fullnames:

CtClass[] ClassPool.getDefault().get(String [] arg0) 

Trả lời

3

Bạn có thể sử dụng một số thư viện như: https://github.com/ronmamo/reflections

Tôi không gầy k bạn có thể làm điều đó chỉ với các lớp JRE.

Ví dụ từ doc:

Reflections reflections = new Reflections("my.project.prefix"); 

Set<Class<? extends SomeType>> subTypes = 
      reflections.getSubTypesOf(SomeType.class); 

Set<Class<?>> annotated = 
      reflections.getTypesAnnotatedWith(SomeAnnotation.class); 
+1

Cảm ơn nhưng tôi muốn làm điều đó với thư viện javassist nếu có thể – user1335838

3

Michael Laffargue 's đề nghị là cách tốt nhất để đi. Thư viện Reflections sử dụng javassist dưới bìa. Về cơ bản, javassist cung cấp một phương tiện đọc mã byte thô từ tệp lớp hoặc tệp jar và trích xuất siêu dữ liệu lớp từ nó mà không thực sự tải lớp, nơi mà Reflections cung cấp API phong phú hơn (định vị thông số lớp) và lọc tập hợp các lớp bạn đang tìm kiếm.

Bạn có thể tự làm điều tương tự bằng cách sử dụng trình chỉ trích javassist, nhưng bạn sẽ tạo lại một phần của thư viện Reflections. Bạn có thể xem mã nguồn của Reflections để xem nó hoạt động như thế nào, nhưng nói chung, nó trông giống như sau:

  1. Tìm đường dẫn lớp bạn muốn quét. Điều này thường sẽ là một nhóm các thư mục với một cây các tập tin lớp, hoặc một nhóm các tệp Jar, nhưng cũng có thể bao gồm các cấu trúc phức tạp hơn như WAR hoặc EAR (mà Reflections hỗ trợ khá độc đáo).

  2. Thêm gốc của hệ thống tệp nơi tệp lớp học trực tiếp hoặc tệp JAR tham chiếu đến cá thể ClassPool của bạn.

  3. Sử dụng lặp lại hệ thống tệp hoặc JarInputStream, lặp qua từng tệp lớp hoặc JarEntry. Bạn có thể lọc ra bất kỳ tệp hoặc mục nhập nào không khớp với "com/stackoverflow/**."
  4. Đối với phần còn lại, sử dụng tên tệp hoặc mục nhập, lấy tên lớp và tải nó từ nhóm lớp javassist .
  5. Sử dụng CtClass được tải để áp dụng bất kỳ tiêu chí tìm kiếm nào khác.
  6. Bây giờ bạn có danh sách tham chiếu lớp học, hãy phát hành ClassPool để thu thập rác.
Các vấn đề liên quan