Refleksi dan obat generik Java - info tipe berparameter tidak ada

Saya ingin menyusun kembali tanda tangan suatu metode menggunakan refleksi di Java 8. Saya mengalami beberapa masalah dengan metode umum. Secara khusus, saya tidak menemukan apa pun untuk membantu memulihkan informasi tentang kasus "meluas" atau "super" dalam deklarasi tipe templat.

Berikut ini kasus pengujian khusus, berdasarkan kode sumber yang diketahui:

Tanda tangan metode dari kode sumber:
public static <T extends AssertDelegateTarget> T assertThat(T assertion)

Pertama-tama, apakah ada cara elegan untuk menyusun kembali bagian <T extends AssertDelegateTarget> tanpa harus mengurai String?

Inilah info utama yang dapat saya peroleh melalui refleksi:

  • method.toString():

    public static org.assertj.core.api.AssertDelegateTarget org.assertj.core.api.Assertions.assertThat(org.assertj.core.api.AssertDelegateTarget)

  • method.toGenericString():

    public static <T> T org.assertj.core.api.Assertions.assertThat(T)

    Apa yang terjadi dengan "extends AssertDelegateTarget"?

  • method.getReturnType.toString():

    interface org.assertj.core.api.AssertDelegateTarget

  • method.getGenericParameterTypes()[0].getTypeName():

    T

Berdasarkan info refleksi di atas, saya dapat mengasumsikan hubungan antara T dan AssertDelegateTarget, namun bagaimana saya tahu apakah itu "meluas" atau "super"?


person aro_tech    schedule 05.02.2016    source sumber


Jawaban (1)


Anda sudah memiliki objek Method. Mulai dari sini, dapatkan parameter tipe yang dideklarasikan pada metode dengan metode getTypeParameters, yang mengembalikan TypeVariable<Method>[]. Ini adalah array dari parameter tipe yang dideklarasikan pada metode. Dalam hal ini ia memiliki satu parameter tipe, sehingga array yang dikembalikan hanya memiliki satu elemen.

TypeVariable antarmuka memiliki metode untuk mengambil nama T, getName, dan metode untuk mengambil batasnya, getBounds. Metode getBounds mengembalikan Type[]. Anda dapat yakin bahwa batasan apa pun di sini adalah batas atas, karena deklarasi variabel tipe tidak diperbolehkan menggunakan super, hanya extends.

Dalam hal ini, variabel Type hanyalah objek Class untuk AssertDelegateTarget.

Sekarang Anda dapat membuat ulang string "<T extends AssertDelegateTarget>" dari informasi di atas. Hanya gunakan "extends" jika Type[] tidak kosong. Jika ada beberapa batas, Anda akan memberi tanda koma di antara batas tersebut, misalnya. T extends Bound1, Bound2.

person rgettman    schedule 05.02.2016