การสะท้อน Java และข้อมูลทั่วไป - ข้อมูลประเภทที่กำหนดพารามิเตอร์ขาดหายไป

ฉันต้องการสร้างลายเซ็นของวิธีการใหม่โดยใช้การสะท้อนกลับใน Java 8 ฉันพบปัญหาบางอย่างเกี่ยวกับวิธีการทั่วไป โดยเฉพาะอย่างยิ่ง ฉันไม่พบสิ่งใดที่จะช่วยกู้คืนข้อมูลเกี่ยวกับกรณีของ "extends" หรือ "super" ในการประกาศประเภทเทมเพลต

ต่อไปนี้เป็นกรณีทดสอบเฉพาะ โดยอิงตามซอร์สโค้ดที่รู้จัก:

ลายเซ็นของวิธีการจากซอร์สโค้ด:
public static <T extends AssertDelegateTarget> T assertThat(T assertion)

ก่อนอื่น มีวิธีที่สง่างามในการสร้างส่วน <T extends AssertDelegateTarget> ใหม่โดยไม่ต้องแยกสตริงหรือไม่

นี่คือข้อมูลหลักที่ฉันสามารถรับได้จากการไตร่ตรอง:

  • 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)

    เกิดอะไรขึ้นกับ "ขยาย AssertDelegateTarget"

  • method.getReturnType.toString():

    interface org.assertj.core.api.AssertDelegateTarget

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

    T

ตามข้อมูลการสะท้อนข้างต้น ฉันสามารถถือว่าความสัมพันธ์ระหว่าง T และ AssertDelegateTarget แต่ฉันจะรู้ได้อย่างไรว่าเป็น "ขยาย" หรือ "ซุปเปอร์"


person aro_tech    schedule 05.02.2016    source แหล่งที่มา


คำตอบ (1)


คุณมีวัตถุ Method อยู่แล้ว เริ่มต้นจากที่นี่ รับพารามิเตอร์ประเภทที่ประกาศไว้บนเมธอดด้วย เมธอด getTypeParameters ซึ่งส่งคืน TypeVariable<Method>[] นี่คืออาร์เรย์ของพารามิเตอร์ประเภทที่ประกาศในเมธอด ในกรณีนี้จะมีพารามิเตอร์ประเภทเดียว ดังนั้นอาร์เรย์ที่ส่งคืนจึงมีองค์ประกอบเดียวเท่านั้น

TypeVariable interface มีวิธีในการ เรียกชื่อ T, getName และวิธีการดึงขอบเขต getBounds วิธีการ getBounds ส่งกลับค่า Type[] คุณสามารถมั่นใจได้ว่าขอบเขตใดๆ ที่นี่เป็นขอบเขตบน เนื่องจากการประกาศตัวแปรประเภทไม่ได้รับอนุญาตให้ใช้ super เพียง extends

ในกรณีนี้ ตัวแปร Type เป็นเพียงออบเจ็กต์ Class สำหรับ AssertDelegateTarget

ตอนนี้คุณสามารถสร้างสตริง "<T extends AssertDelegateTarget>" ใหม่ได้จากข้อมูลข้างต้น ใช้ "ขยาย" หาก Type[] ไม่ว่างเปล่าเท่านั้น หากมีขอบเขตหลายขอบเขต ให้ใส่ลูกน้ำคั่นระหว่างขอบเขตเหล่านั้น เช่น T extends Bound1, Bound2.

person rgettman    schedule 05.02.2016