12/08/2018, 13:37

Java reflection and anotation

I. Java Reflection Reflection là một kĩ thuật cho phép có thể duyệt và thay đổi các thuộc tính và phuơng thức của một class hoặc một interface tại thời điểm runtime, nó là một kĩ thuật rất mạnh và hữu ích cho các lập trình viên. Khi đọc khái niệm này chắc hẳn các bạn sẽ thắc mắc vậy ...

I. Java Reflection

Reflection là một kĩ thuật cho phép có thể duyệt và thay đổi các thuộc tính và phuơng thức của một class hoặc một interface tại thời điểm runtime, nó là một kĩ thuật rất mạnh và hữu ích cho các lập trình viên.

Khi đọc khái niệm này chắc hẳn các bạn sẽ thắc mắc vậy reflection thường được dùng trong trường hợp nào?. Thật ra reflection thường khá ít được sử dụng và chỉ những lập trình viên có kinh nghiệm mới hay sử dụng nó. Có thể lấy một ví dụ về việc sử dụng reflection như sau:

Giả sử bạn có một đối tượng nhưng không hề biết kiểu của đối tượng này và bạn muốn gọi một phuơng thức "dosomething()" của đối tượng nếu nó tồn tại, điều này không phải dễ thực hiện nhưng reflection sẽ giúp thực hiện điều này .

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

Bài viết này sẽ tập trung giới thiệu các thành phần cơ bản của Reflection và cách sử dụng reflection với anotation, một trong những trường hợp được sử dụng phổ biến khi áp dụng reflection trong java.

II. Các thành phần cơ bản của Reflection.

1.Java Reflection - Classes

Khi sử dụng java reflection để duyệt qua một class thì việc đầu tiên thường phải làm đó là có được một đối tượng kiểu Class, từ các đối tượng kiểu Class chúng ta có thể lấy được các thông tin về:

  • Class Name

  • Class Modifies (public, private, synchronized etc.)

  • Package Info

  • Superclass

  • Implemented Interfaces

  • Constructors

  • Methods

  • Fields

  • Annotations

Vậy làm sao để có thể tạo một class object. Bạn Có thể tạo một đối tượng Class khi biết được tên của Lớp tại thời điểm compile

 Class myObjectClass = MyObject.class

Khi bạn không biết chính xác tên của lớp tại thời điểm compile nhưng bạn có một chuỗi String là tên của lớp tại thời điểm runtime thì bạn cũng có thể tạo được class object cho lớp đó

Class class = Class.forName(className);

2.Java Reflection - Constructors

Các đối tượng lớp Constructor là những phuơng thức khởi tạo của một lớp. Reflection cho phép lấy ra những Contructor từ Class Object

Class aClass = ...//obtain class object
Constructor[] constructors = aClass.getConstructors();

Bạn cũng có thể truy cập được đến tham số của các Contructor, các tham số này đều được đưa về kiêủ Class.

Constructor constructor = ... // obtain constructor - see above
Class[] parameterTypes = constructor.getParameterTypes();

Tạo một đối tượng của một Lớp từ đối tượng Contructor

Constructor constructor = MyObject.class.getConstructor(String.class);

MyObject myObject = (MyObject)constructor.newInstance("constructor-arg1");

3.Java Reflection - Fields

Field là lớp các đối tượng đại diện cho một thuộc tính của một lớp. Bạn có thể duyệt và lấy ra các đối tượng này từ class object

Class aClass = ...//obtain class object
Field[] fields = aClass.getFields();

Set các giá trị cho Fields

Class  aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);

field.set(objetInstance, value);

4.Java Reflection - Methods

Như đã nói ở trước đó, khi bạn sử dụng java reflection bạn có thể truy cập vào các phuơng thức của một lớp và gọi những phuơng thức này.

Đối tượng Method được get từ class object

Class aClass = ...//obtain class object
Method[] methods = aClass.getMethods();

Gọi phuơng thức từ đối tượng Method

//get method that takes a String as argument
Method method = MyObject.class.getMethod("doSomething", String.class);

Object returnValue = method.invoke(null, "parameter-value1");

Ở bài viết này mình xin dừng lại ở việc giới thiệu về Java Reflection. Ở bài viết tiếp theo mình sẽ giới thiệu với các bạn về Anotation và cách sử dụng Anotation cùng với Reflection.

Update: Phần giới thiệu về Annotation mình đã viết xong trong link này: https://viblo.asia/p/annotation-su-dung-annotation-voi-reflection-trong-java-PDOkqXxyejx References https://docs.oracle.com/javase/tutorial/reflect/

http://tutorials.jenkov.com/java-reflection/constructors.html

0