Daily Archives: 06/01/2017

JNI – Reflection

Reflection hay Introspection là tính năng cho phép chúng ta “điều tra” xem đối tượng/lớp/biến…v.v gồm có những gì. Chẳng hạn như tìm hiểu xem một đối tượng đó gồm có những thuộc tính gì và phương thức gì.

Trong Java thì reflection được hỗ trợ rất đầy đủ trong gói java.lang.reflect, ngoài ra một số phương thức trong lớp java.lang.Objectjava.lang.Class cũng hỗ trợ reflection, chúng ta có thể gọi các lớp này ở native để thực hiện reflection cũng được, hoặc chúng ta có thể dùng một số hàm của JNI như:

  • jclass GetSuperclass(jclass cls): nhận vào một lớp, trả về lớp cha của lớp đó
  • jboolean IsAssignableFrom(jclass clsA, jclass clsB): nhận vào 2 lớp a, b trả về true hoặc false, cho biết lớp a có thể ép kiểu sang lớp b hay không
  • jclass GetObjectClass(jobject obj): chúng ta đã làm nhiều với hàm này rồi, hàm này nhận vào một đối tượng và trả về lớp của đối tượng đó
  • jboolean IsInstanceOf(jobject obj, jclass cls): nhận vào một đối tượng và một lớp, trả về true hoặc false cho biế đối tượng đó có phải sinh ra từ lớp đó hay không
  • jmethodID FromReflectedField(jobject method)chuyển một đối tượng java.lang.reflect.Method hoặc java.lang.reflect.Constructor sang một đối tượng jmethodID
  • jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic): chuyển một đối tượng jfieldID từ cls sang một đối tượng java.lang.reflect.Field, nếu trường đó là static thì isStatic là true, ngược lại là false
  • jmethodID FromReflectedMethod(jobject method): chuyển một đối tượng java.lang.reflect.Method hoặc java.lang.reflect.Constructor sang một đối tượng jmethodID
  • jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic): chuyển một đối tượng jmethodID kế thừa từ jclass sang một đối tượng java.lang.reflect.Method hoặc java.lang.reflect.Constructor, nếu phương thức là static thì isStatic là true, ngược lại là false