ไม่มีการสนับสนุนทางภาษาในการทำสิ่งที่คุณขอ
คุณสามารถเข้าถึงสมาชิกของประเภทในขณะรันไทม์โดยใช้การสะท้อนกลับ (เช่นClass.getDeclaredFields()
เพื่อรับอาร์เรย์Field
) แต่ขึ้นอยู่กับสิ่งที่คุณพยายามทำนี่อาจไม่ใช่ทางออกที่ดีที่สุด
ดูสิ่งนี้ด้วย
คำถามที่เกี่ยวข้อง
ตัวอย่าง
นี่คือตัวอย่างง่ายๆเพื่อแสดงให้เห็นว่าการสะท้อนกลับสามารถทำได้เพียงบางส่วนเท่านั้น
import java.lang.reflect.*;
public class DumpFields {
public static void main(String[] args) {
inspect(String.class);
}
static <T> void inspect(Class<T> klazz) {
Field[] fields = klazz.getDeclaredFields();
System.out.printf("%d fields:%n", fields.length);
for (Field field : fields) {
System.out.printf("%s %s %s%n",
Modifier.toString(field.getModifiers()),
field.getType().getSimpleName(),
field.getName()
);
}
}
}
ตัวอย่างข้อมูลข้างต้นใช้การสะท้อนเพื่อตรวจสอบฟิลด์ที่ประกาศทั้งหมดของclass String
; มันสร้างผลลัพธ์ต่อไปนี้:
7 fields:
private final char[] value
private final int offset
private final int count
private int hash
private static final long serialVersionUID
private static final ObjectStreamField[] serialPersistentFields
public static final Comparator CASE_INSENSITIVE_ORDER
Effective Java 2nd Edition, Item 53: ชอบอินเทอร์เฟซสำหรับการสะท้อนแสง
นี่คือข้อความที่ตัดตอนมาจากหนังสือ:
กำหนดClass
วัตถุที่คุณสามารถได้รับConstructor
, Method
และField
กรณีที่เป็นตัวแทนของการก่อสร้างงานวิธีการและสาขาของชั้นเรียน [พวกเขา] ช่วยให้คุณจัดการกับคู่หูที่อยู่ภายใต้การไตร่ตรองได้ อย่างไรก็ตามพลังนี้มาในราคา:
- คุณเสียประโยชน์ทั้งหมดของการตรวจสอบเวลาคอมไพล์
- รหัสที่จำเป็นในการเข้าถึงแบบสะท้อนแสงนั้นเงอะงะและดูละเอียด
- ประสิทธิภาพไม่ดี
ตามกฎแล้วไม่ควรเข้าถึงออบเจ็กต์แบบสะท้อนแสงในแอปพลิเคชันปกติที่รันไทม์
มีแอพพลิเคชั่นที่ซับซ้อนบางอย่างที่ต้องการการสะท้อนแสง ตัวอย่าง ได้แก่[... ละไว้โดยมีวัตถุประสงค์ ... ]หากคุณมีข้อสงสัยว่าแอปพลิเคชันของคุณอยู่ในหมวดหมู่ใดประเภทหนึ่งเหล่านี้อาจจะไม่