01/10/2018, 14:49

Cách lấy ra method của class abstract interface thông qua Reflection?

A -> Abstract class extends B implement C

B là class bình thường

C là Abstract Interface

  • C có hàm insertObject(object o)

Mình có table Product
-> Có Class Product_GenericDao extends A.

Nếu đem class này đi sử dụng ta có thể sử dụng:
Product_GenericDao genDao = new Product_GenericDao();
genDao.insertObject(object); -> Ok cái này thì không có vấn đề gì.

Vấn đề khi sử dụng Reflection sử dụng class này.

Class<Product_GenericDao> aClass = Product_GenericDao.class
Method method = Class.getMethod(“insertObject”, object);
=> Thì bị báo là NoSuchMethod…

-> Mình đã tìm ra nguyên ngân do hàm insertObject là của thằng cha, mà việc getMethod này chỉ lấy được
những method tại class này thôi. Vậy có cách nào để e getMethod của thằng C từ thằng aClass
này không mọi người?

Tien VNC viết 16:49 ngày 01/10/2018

Cái này có thể do compiler remove mất (do nó tìm trong code không có ai gọi hàm này)…
Bạn thử thêm dòng gọi vu vơ nào đó (để compiler đánh dấu là có dùng) xem có fix được không

Tạ Duy Hoàng viết 16:49 ngày 01/10/2018

Nếu trong hàm đó mình viết 1 hàm overidde lại và gọi supper.insertObject trong đó thì lúc này method kia lại có giá trị và ko bị chết nữa. Do hiểu là Class hiện tại nó chưa nhìn thấy được hàm insertObject kia. Mình thử Class.getSupperClass thì nó chỉ tới class A thôi. Chưa tới IF C mà mình cần.

Tien VNC viết 16:56 ngày 01/10/2018

Để biết chính xác tại sao thì bạn phải unzip file jar, decode class A, và decode IF C, xem trong IF C này có còn method đó không.
Mình đoán là compiler đã tự optimized cái IF C (tự remove method đó rồi, do không ai gọi nó trước khi compile thành file .class)

Nguyen Ca viết 16:55 ngày 01/10/2018

Class aClass = Product_GenericDao.class
Method method = Class.getMethod(“insertObject”, object);
=> Thì bị báo là NoSuchMethod…

aClass

biến này có tác dùng gì ??

API doc

getMethod(String name, Class<?>… parameterTypes)
Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.

Method[] getMethods()
Returns an array containing Method objects reflecting all the public member methods of the class or interface represented by this Class object, including those declared by the class or interface and those inherited from superclasses and superinterfaces.

Bài liên quan
0