รับค่าของฟิลด์ / คุณสมบัติสุดท้ายแบบคงที่สาธารณะของคลาสใน Java ผ่านการสะท้อนกลับ


103

บอกว่าฉันมีคลาส:

public class R {
    public static final int _1st = 0x334455;
}

ฉันจะรับค่าของ"_1st"ผ่านการสะท้อนได้อย่างไร


R._1stทำงานไม่ได้? หากคุณกำลังพูดถึงการพัฒนา Android ฉันคิดว่าRชั้นเรียนอยู่ที่นั่นเสมอ ...
Matthieu

@ Matthieu ฉันก็คิดเหมือนกันจนถึงวันนี้เมื่อฉันต้องทำสิ่งเดียวกันนี้ แต่เฉพาะกับBRชั้นเรียน
Sevastyan Savanyuk

คำตอบ:


132

ก่อนอื่นให้ดึงคุณสมบัติฟิลด์ของคลาสจากนั้นคุณสามารถดึงค่าได้ หากคุณทราบประเภทคุณสามารถใช้เมธอด get แบบใดแบบหนึ่งที่มีค่า null (สำหรับฟิลด์แบบคงที่เท่านั้นอันที่จริงแล้วด้วยฟิลด์แบบคงที่อาร์กิวเมนต์ที่ส่งไปยังเมธอด get จะถูกละเว้นทั้งหมด) มิฉะนั้นคุณสามารถใช้ getType และเขียนสวิตช์ที่เหมาะสมดังต่อไปนี้:

Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
    System.out.println(f.getInt(null));
}else if(t == double.class){
    System.out.println(f.getDouble(null));
}...

ขอบคุณ. ฉันพยายามแล้วแต่มันไม่ได้ผล ข้อยกเว้นถูกส่งไปที่การดำเนินการ f.getInt (null) ฉันจับได้ แต่ทำไมถึงมีข้อยกเว้น?
เวียด

1
คุณได้รับข้อยกเว้นประเภทใด
M. Jessup

สวัสดี Exception e.getMessage () ส่งคืนชื่อฟิลด์ซึ่งเป็น "_1st" และไม่มีอะไรอื่น
เวียด

1
แต่ประเภทของข้อยกเว้นคืออะไร? (เช่น NullPointerException, SecurityException, ... )
M. Jessup

2
เหตุใดเอกสารจึงไม่เคยกล่าวถึงที่getInt()เพิกเฉยต่อการโต้แย้งที่ผ่านมา ใช้เวลาหลายชั่วโมงในการพยายามทำให้อินสแตนซ์ของชั้นเรียนผ่านไปที่นั่น
Sevastyan Savanyuk

70
 R.class.getField("_1st").get(null);

การจัดการข้อยกเว้นถูกปล่อยให้เป็นแบบฝึกหัดสำหรับผู้อ่าน

โดยทั่วไปคุณจะได้รับฟิลด์เหมือนกับที่อื่น ๆ ผ่านการสะท้อน แต่เมื่อคุณเรียกใช้เมธอด get คุณจะส่งผ่านค่าว่างเนื่องจากไม่มีอินสแตนซ์ที่จะดำเนินการ

สิ่งนี้ใช้ได้กับฟิลด์แบบคงที่ทั้งหมดโดยไม่คำนึงถึงฟิลด์สุดท้าย หากฟิลด์ไม่ได้เป็นแบบสาธารณะคุณต้องโทรหาsetAccessible(true)ก่อนและแน่นอนว่า SecurityManager ต้องอนุญาตทั้งหมดนี้


ฉันเข้าใจแล้ว. ชั้นเรียนที่ฉันต้องการคือ Rid จริงๆ ขอบคุณสำหรับความช่วยเหลือของคุณ!
เวียด

1

ฉันกำลังไปตามเส้นทางเดียวกัน (มองผ่านคลาส R ที่สร้างขึ้น) และจากนั้นฉันก็รู้สึกแย่มากว่ามันน่าจะเป็นฟังก์ชันในคลาสทรัพยากร ฉันถูก.

พบสิ่งนี้: ทรัพยากร :: getIdentifier

คิดว่าอาจช่วยคนได้บ้าง แม้ว่าพวกเขาจะบอกว่ามันหมดกำลังใจในเอกสารซึ่งก็ไม่น่าแปลกใจนัก


ดังนั้นคุณจึงสรุปได้ว่าเป็นคำถามของ Android ควรระบุไว้ในแท็ก ...
Matthieu

ไม่ใช่คำถาม Android แต่เป็นคำถามสะท้อน Java ที่ใช้ตัวอย่างเฉพาะ คำถามจะถูกแท็กตามหัวข้อของพวกเขา
Matthew อ่าน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.