ClassReflectionDemo
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพคเกจสะท้อน;
@เลิกใช้แล้ว
ReflectionDemo ระดับสาธารณะ {
สตริงส่วนตัว pri_field;
สตริงสาธารณะ pub_field;
การสะท้อนสาธารณะDemo(){}
ReflectionDemo สาธารณะ (ชื่อสตริง){}
ReflectionDemo ส่วนตัว (ชื่อสตริง int int1){}
โมฆะสาธารณะ ReflectMethod(){}
โมฆะสาธารณะ ReflectMethod (String str) {}
โมฆะส่วนตัว ReflectMethod (int int1) {}
คลาส innerclss_Refection{}
-
คลาสทดสอบการสะท้อนการสาธิตการทดสอบ
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพคเกจสะท้อน;
นำเข้า java.lang.annotation.Annotation;
นำเข้า java.lang.reflect.Constructor;
นำเข้า java.lang.reflect.Field;
นำเข้า java.lang.reflect.Method;
ReflectionDemoTest คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
//สร้างคลาสอ็อบเจ็กต์และใช้การแก้ไขทั่วไปเพื่อหลีกเลี่ยงการบังคับถ่ายโอน
คลาส cla=ReflectionDemo.class;
//วิธีรับช่องสาธารณะทั้งหมด
ฟิลด์[] ฟิลด์=cla.getFields();
สำหรับ(ฟิลด์ f:ฟิลด์){
System.out.println("วิธีการรับฟิลด์สาธารณะทั้งหมด:"+f.toString());
-
//วิธีการรับโดเมนสาธารณะที่ระบุ
พยายาม {
ฟิลด์ field1=cla.getField("pub_field");
System.out.println("วิธีการรับฟิลด์สาธารณะที่ระบุ:"+field1.toString());
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchFieldException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
//วิธีการรับโดเมนทั้งหมด (รวมถึงโดเมนส่วนตัว) ประกาศ
ฟิลด์[] field2=cla.getDeclaredFields();
สำหรับ(ฟิลด์ f:field2){
System.out.println("วิธีการรับฟิลด์ทั้งหมด (รวมถึงฟิลด์ส่วนตัว):"+f.toString());
-
//วิธีการรับโดเมนที่ระบุ (รวมถึงโดเมนส่วนตัว)
พยายาม {
ฟิลด์ field3=cla.getDeclaredField("pri_field");
System.out.println("วิธีการรับฟิลด์ที่ระบุ (รวมถึงฟิลด์ส่วนตัว):"+field3.toString());
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchFieldException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
// รับวิธีการสาธารณะทั้งหมด (รวมถึงคลาสผู้ปกครอง)
วิธีการ[] วิธีการ=cla.getMethods();
สำหรับ (วิธี m: วิธี) {
System.out.println("รับวิธีการสาธารณะทั้งหมด:"+m.toString());
-
พยายาม {
// รับวิธีการแบบไม่มีพารามิเตอร์ที่ระบุ
// พารามิเตอร์ตัวที่สองระบุประเภทพารามิเตอร์ และพารามิเตอร์ NUll ระบุวิธีการแบบไม่มีพารามิเตอร์
วิธีการ method1=cla.getMethod("ReflectMethod", null);
System.out.println("รับวิธีการของวิธีสาธารณะโดยไม่มีพารามิเตอร์:"+method1.toString());
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchMethodException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
//วิธีการรับเมธอดทั้งหมดของคลาสนี้ (ไม่รวมคลาสพาเรนต์)
วิธีการ[] method2=cla.getDeclaredMethods();
สำหรับ (วิธี m: method2) {
System.out.println("รับวิธีการทั้งหมด (รวมถึงคลาสพาเรนต์):"+m.toString());
-
// รับวิธีการของวิธีการที่ระบุของคลาสนี้ (ไม่รวมคลาสผู้ปกครอง)
//พารามิเตอร์ตัวแรกคือชื่อเมธอด พารามิเตอร์ตัวที่สองคือประเภทการส่งคืนเมธอด และ NULL คือเมธอดที่ไม่มีพารามิเตอร์
พยายาม {
วิธีการ method3=cla.getDeclaredMethod("ReflectMethod",int.class);
System.out.println("รับวิธีการของวิธีการที่ระบุของคลาสนี้ (ไม่รวมคลาสพาเรนต์):"+method3);
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchMethodException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
// รับตัวสร้างสาธารณะ
// รับตัวสร้างสาธารณะโดยไม่มีพารามิเตอร์
พยายาม {
ตัวสร้าง cs=cla.getConstructor(null);
System.out.println("รับตัวสร้างแบบไม่มีพารามิเตอร์:"+cs);
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchMethodException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
// รับตัวสร้างสาธารณะพร้อมพารามิเตอร์
//หากมีตัวสร้างที่มีหลายพารามิเตอร์ ก็แสดงว่ามีตัวสร้างหลายตัว ให้ความสนใจกับลำดับ
พยายาม {
ตัวสร้าง cs=cla.getConstructor(String.class);
System.out.println("รับตัวสร้างพารามิเตอร์:"+cs);
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (NoSuchMethodException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
//รับวิธีการก่อสร้างทั้งหมด
พยายาม {
ตัวสร้าง [] cs = cla.getDeclaredConstructors ();
สำหรับ (ตัวสร้าง c:cs){
System.out.println("รับวิธีการก่อสร้างทั้งหมด:"+c);
-
} จับ (SecurityException e) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
// รับชื่อแพ็คเกจ
แพ็คเกจแพ็ค=cla.getPackage();
System.out.println("รับชื่อของแพ็คเกจปัจจุบัน:"+pack);
//รับความคิดเห็น
คำอธิบายประกอบ[] ann=cla.getAnnotations();
สำหรับ (คำอธิบายประกอบและ:ann){
System.out.println(an.toString());
-
//รับคลาสผู้ปกครอง
คลาส supercla=cla.getSuperclass();
System.out.println(ซุปเปอร์คลา);
//รับชั้นใน
คลาส[] Innercla=cla.getDeclaredClasses();
สำหรับ (คลาส cl: Innercla) {
System.out.println(cl);
-
-
-
สรุป: ขั้นตอนในการรับข้อมูลเกี่ยวกับออบเจ็กต์คลาส:
1. สร้างคลาสอ็อบเจ็กต์ วิธีที่ 1 Class cla=Class.forName(“PATH”) วิธีที่ 2 CLass cla=Instance.getclass(); วิธีที่ 3 Class cla=Class.class
2. ใช้ Field, Method, Constructor, Package และ Annotation เพื่อรับข้อมูลที่เกี่ยวข้องโดยการเรียกเมธอด cla.getXXXX
3. วิธีการรับคลาสพาเรนต์และคลาสภายในจะแตกต่างกันเล็กน้อย
4. เมื่อใช้ cla.getMethods เมธอดสาธารณะทั้งหมดของคลาสและคลาสพาเรนต์จะถูกเรียก
5. เมื่อใช้ Declared เมธอดทั้งหมดของคลาส รวมถึงเมธอดส่วนตัว จะถูกเรียกใช้เช่นเดียวกันกับโดเมนและคอนสตรัคเตอร์
6. เมื่อคลาสการสะท้อนกลับไม่มีตัวสร้างสาธารณะและไม่สามารถใช้เมธอด newInstance ได้โดยตรง ให้ใช้
Method cs=cla.getMethod("getInstance",null);//รับเมธอด
ปฏิทินปฏิทิน=(ปฏิทิน) cs.invoid(cla, null);//ดำเนินการวิธีการที่ได้รับ พารามิเตอร์ 1 เป็นวัตถุของวิธีการดำเนินการ พารามิเตอร์ 2 แสดงถึงพารามิเตอร์ของวิธีการ
วันที่ df=calendar.getTime();
System.out.println(df.toString());
ที่จะได้รับ