menu

VanThuong.Com

Blog học lập trình Java và SEO miễn phí.

Khám phá Class bằng Java Reflection

Posted by on
Như tôi đã nhắc đến trong bài viết giới thiệu về Java Reflection. Đây là sẽ là bài viết tiếp theo giúp các bạn tiếp cận với chủ đề này. Chúng ta sẽ bắt đầu với việc khám phá Class bằng Java Reflection.
Khám phá Class bằng Java Reflection
Tại thời điểm runtime, bạn có thể sử dụng Java Reflection để khám phá các lớp của Java. Nó cho phép bạn lấy được thông tin của những thứ như:
  • Class Name
  • Class Modifiers (public, private, synchronized etc.)
  • Package Info
  • Superclass
  • Implemented Interfaces
  • Constructors
  • Methods
  • Fields
  • Annotations
và nhiều thông tin khác liên quan đến Class. Tôi nghĩ các bạn nên khám phá bản JavaDoc về java.lang.Class trên trang chủ của Oracle để biết được danh sách đầy đủ những thứ có thể thu nhận được từ việc sử dụng Java Reflection.

Class Object

Trước khi bạn có thể khám phá một class bất kỳ trong Java, bạn cần phải có đối tượng java.lang.Class của nó. Tất cả các kiểu trong Java, bao gồm cả kiểu dữ liệu nguyên thủy (int, long, float,..), các mảng đều có một đối tượng liên kết mà bạn có thể obtain. Nếu như bạn biết trước tên lớp của đối tượng tại thời điểm biên dịch, bạn có thể lấy được đối tượng Class của nó như ví dụ sau:
Class myObjectClass = MyObject.class;

Nếu như bạn không biết được tên của class tại thời điểm biên dịch, nhưng bạn có class nam của nó là một String tại Runtime, bạn có thể lấy được bằng cách sau:
String className = ... //lấy tên lớp trong thời điểm runtime
Class class = Class.forName(className);
Tuy nhiên, khi sử dụng Class.forName() bạn phải có đường dẫn đầy đủ đến class đó (qualified class name). Ví dụ, nếu như tôi tạo đối tượng Class của Person tôi phải có đường dẫn đầy đủ bao gồm package name + tên đối tượng => Qualified class name sẽ là com.vanthuong.tutorial.model.Person chẳng hạn.

Phương thức Class.forName() sẽ ném ra một ngoại lệ ClassNotFoundException nếu như lớp này không được tìm thấy từ classpath tại Runtime.

Lấy tên của Class

Từ một đối tượng của Class bạn có thể lấy được tên của nó với 2 version. Lấy tên lớp đầy đủ (bao gồm cả package name) bằng cách gọi phương thức getName() như sau:
Class aClass = ... //obtain Class object
String className = aClass.getName();

Nếu như bạn chỉ muốn lấy tên của class mà không cần đến package name bạn có thể gọi phương thức getSimpleName() như ví dụ sau:
Class  aClass          = ... //obtain Class object.
String simpleClassName = aClass.getSimpleName();

Modifiers

Như bạn đã biết thì mỗi class đều có các modifiers riêng, và bạn hoàn toàn có thể kiểm tra được nó thông qua đối tượng Class. Các class modifier là các từ khóa như "public", "private", "static",.... bạn có thể lấy nó như sau:
Class aClass          = ... //obtain Class object.
int modifiers = aClass.getModifiers();

Sau khi bạn đã có được giá trị int, để kiểm tra xem nó thuộc những modifier nào bạn có thể sử dụng các phương thức trong lớp java.lang.reflect.Modifier như sau:

Modifier.isAbstract(int modifiers)
Modifier.isFinal(int modifiers)
Modifier.isInterface(int modifiers)
Modifier.isNative(int modifiers)
Modifier.isPrivate(int modifiers)
Modifier.isProtected(int modifiers)
Modifier.isPublic(int modifiers)
Modifier.isStatic(int modifiers)
Modifier.isStrict(int modifiers)
Modifier.isSynchronized(int modifiers)
Modifier.isTransient(int modifiers)
Modifier.isVolatile(int modifiers)

Package Info

Từ đối tượng Class, bạn có thể lấy được các thông tin của package. Để bắt đầu tọc mạch những thông tin về package bạn cần có đối tượng Package từ Class như sau:
Class  aClass = ... //obtain Class object.
Package package = aClass.getPackage();

Từ đối tượng Package này, bạn có thể dễ dàng lấy các thông tin về nó ví dụ như tên của nó qua method getName(). Bạn cũng có thể tiếp cận được các thông tin cụ thể về package trong tập tin Manifest của file JAR. Bạn có thể tham khảo thêm về Package class để biết mình có thể lấy được những gì từ việc sử dụng Reflection tại link:
http://docs.oracle.com/javase/8/docs/api/java/lang/Package.html

Superclass

Giả sử bạn có một lớp cơ sở A và được extends bởi một lớp B. Hiện tại bạn đang có đối tượng Class của lớp B và bạn muốn access vào để lấy những thông tin của lớp A. Bạn có hoàn toàn có thể làm được điều này bằng cách sau:
Class childClass = ... // obtain Class object.
Class superClass = childClass.getSuperClass();

Implemented Interfaces

Tại thời điểm Runtime, bạn muốn kiểm tra xem Class của đối tượng đã implements những interface nào thì điều đó hoàn toàn có thể.
Class  aClass = ... //obtain Class object.
Class[] interfaces = aClass.getInterfaces();
Vì một lớp có thể implements nhiều Interface khác nhau nên phương thức này sẽ trả về ở dạng mảng. Các interface cũng được thể hiện bởi đối tượng Class trong Java Reflection.

Lưu ý rằng: Khi một lớp A thực thi nhiều Interface khác nhau, nhưng lớp B extends từ lớp A thì khi bạn gọi phương thức này nó sẽ không trả về được danh sách các Interface mà lớp A đã thực thi. Nếu như bạn muốn lấy được danh sách những interface của lớp A, bạn hãy tiếp cận nó bằng cách sử dụng Superclass vừa được đề cập ở trên nhé.

Tạm kết

Vẫn còn 4 mục được mình nêu ra ở đầu bài viết bao gồm:
  1. Constructors
  2. Methods
  3. Fields
  4. Annotations
nhưng không được đề cập đến ở trong bài viết này. Mình sẽ giành nó để giới thiệu chi tiết hơn để các bạn trong những bài viết tiếp theo. Cùng đón xem những bài viết mới trên blog của mình nhé.
Đăng bình luận

menu