บอกว่าฉันมีคลาส:
public class R {
public static final int _1st = 0x334455;
}
ฉันจะรับค่าของ"_1st"ผ่านการสะท้อนได้อย่างไร
บอกว่าฉันมีคลาส:
public class R {
public static final int _1st = 0x334455;
}
ฉันจะรับค่าของ"_1st"ผ่านการสะท้อนได้อย่างไร
BR
ชั้นเรียน
คำตอบ:
ก่อนอื่นให้ดึงคุณสมบัติฟิลด์ของคลาสจากนั้นคุณสามารถดึงค่าได้ หากคุณทราบประเภทคุณสามารถใช้เมธอด 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));
}...
getInt()
เพิกเฉยต่อการโต้แย้งที่ผ่านมา ใช้เวลาหลายชั่วโมงในการพยายามทำให้อินสแตนซ์ของชั้นเรียนผ่านไปที่นั่น
R.class.getField("_1st").get(null);
การจัดการข้อยกเว้นถูกปล่อยให้เป็นแบบฝึกหัดสำหรับผู้อ่าน
โดยทั่วไปคุณจะได้รับฟิลด์เหมือนกับที่อื่น ๆ ผ่านการสะท้อน แต่เมื่อคุณเรียกใช้เมธอด get คุณจะส่งผ่านค่าว่างเนื่องจากไม่มีอินสแตนซ์ที่จะดำเนินการ
สิ่งนี้ใช้ได้กับฟิลด์แบบคงที่ทั้งหมดโดยไม่คำนึงถึงฟิลด์สุดท้าย หากฟิลด์ไม่ได้เป็นแบบสาธารณะคุณต้องโทรหาsetAccessible(true)
ก่อนและแน่นอนว่า SecurityManager ต้องอนุญาตทั้งหมดนี้
ฉันกำลังไปตามเส้นทางเดียวกัน (มองผ่านคลาส R ที่สร้างขึ้น) และจากนั้นฉันก็รู้สึกแย่มากว่ามันน่าจะเป็นฟังก์ชันในคลาสทรัพยากร ฉันถูก.
พบสิ่งนี้: ทรัพยากร :: getIdentifier
คิดว่าอาจช่วยคนได้บ้าง แม้ว่าพวกเขาจะบอกว่ามันหมดกำลังใจในเอกสารซึ่งก็ไม่น่าแปลกใจนัก
R._1st
ทำงานไม่ได้? หากคุณกำลังพูดถึงการพัฒนา Android ฉันคิดว่าR
ชั้นเรียนอยู่ที่นั่นเสมอ ...