คำอธิบายประกอบแบบกำหนดเองของ Java
คำอธิบายประกอบ Java เป็นข้อมูลเมตาบางส่วนที่แนบมากับรหัสซึ่งใช้สำหรับการแยกวิเคราะห์และใช้เครื่องมือบางอย่างระหว่างการรวบรวมและรันไทม์และทำหน้าที่เป็นคำอธิบายและฟังก์ชั่นการกำหนดค่า
คำอธิบายประกอบจะไม่และไม่สามารถส่งผลกระทบต่อตรรกะที่แท้จริงของรหัสและมีบทบาทเสริมเท่านั้น รวมอยู่ในแพ็คเกจ java.lang.annotation
1. เมตาโน้ต
Meta-Annotation หมายถึงคำอธิบายประกอบของคำอธิบายประกอบ รวมถึงสี่ประเภท: @retention @target @document @inherited
1.1. @retention: กำหนดกลยุทธ์การเก็บรักษาของคำอธิบายประกอบ
@Retention (RECENTIONPICALY.Source) // คำอธิบายประกอบมีอยู่ในซอร์สโค้ดเท่านั้นและไม่มี @Retention (RESINGINTPICALY.CLASS) // นโยบายการเก็บรักษาเริ่มต้นใช้ คำอธิบายประกอบจะมีอยู่ในไฟล์คลาส Bytecode แต่ไม่สามารถรับได้ที่รันไทม์ @Retention (REVENITIONPICALY.RUNTIME) // คำอธิบายประกอบจะมีอยู่ในไฟล์คลาส BYTECODE และสามารถรับได้ผ่านการสะท้อนกลับที่รันไทม์
คลาสคำอธิบายประกอบ:
@Retention (REVENITIONPICALY.RUNTIME) // คำอธิบายประกอบจะมีอยู่ในไฟล์ BYTECODE คลาส @Target ({ElementType.field, ElementType.method} สามารถรับได้ผ่านการสะท้อนที่รันไทม์ // กำหนดเป้าหมายของคำอธิบายประกอบ ** ช่วงของสนามและค่าคงที่การแจงนับ/วิธีการ // ระบุว่าคำอธิบายประกอบจะรวมอยู่ในจาวา false;/*** ชื่อฟิลด์* @return*/ชื่อสตริง () ค่าเริ่มต้น "";/*** มันแก้ไขได้* @return*/บูลีนแก้ไขได้ () ค่าเริ่มต้นจริง;/*** ไม่ว่าจะแสดงในรายการ* @return*/boolean summary () ค่าเริ่มต้น 0;} ระดับเอนทิตี:
คลาสสาธารณะ anno {@fieldMeta (id = true, name = "หมายเลขซีเรียล", order = 1) ID int ส่วนตัว; @fieldMeta (ชื่อ = "ชื่อ", order = 3) ชื่อสตริงส่วนตัว; @fieldMeta (ชื่อ = "อายุ", ลำดับ = 2) getId () {return id;} โมฆะสาธารณะ setId (int id) {this.id = id;} สตริงสาธารณะ getName () {ชื่อคืน;} โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name;} public int getage () {return Age; รับคลาสช่วยเหลือสำหรับคำอธิบายประกอบ:
Public Class SortableField {Public SortableField () {} Public SortableField (Meta FieldMeta, สนามฟิลด์) {super (); this.meta = meta; this.field = field; this.name = field.getName (); this.type = field.getType (); meta; this.name = name; this.type = type;} private fieldmeta meta; เขตข้อมูลภาคเอกชน; ชื่อสตริงส่วนตัว; คลาสส่วนตัว <?> ประเภท; public fieldmeta getMeta () {return meta;} public void setMeta (FieldMeta Meta) ฟิลด์;} สตริงสาธารณะ getName () {return name;} public void setName (ชื่อสตริง) {this.name = name;} คลาสสาธารณะ <?> getType () {return type;} โมฆะสาธารณะ setType (คลาส <?> ประเภท) หากต้องการรับคำอธิบายประกอบที่รันไทม์ก่อนอื่นให้สร้างคลาสพื้นฐาน:
พาเรนต์ระดับสาธารณะ <t> {คลาสส่วนตัว <T> เอนทิตี; พาเรนต์สาธารณะ () {init ();}@suppresswarnings ("ไม่ได้ตรวจสอบ") รายการสาธารณะ <SortableField> init () {รายการ <SortableField> รายการ = new ArrayList <SortableField> () คลาส (คลาส, อินเทอร์เฟซ, ประเภทดั้งเดิมหรือโมฆะ) *จากนั้นแปลงเป็นพารามิเตอร์ TTYPE - * GetActualTypeArguments () ส่งคืนอาร์เรย์ของประเภทวัตถุที่แสดงถึงพารามิเตอร์ประเภทจริงของประเภทนี้ * [0] เป็นคนแรกในอาร์เรย์นี้ - * ในระยะสั้นคือการได้รับพารามิเตอร์ทั่วไปของพารามิเตอร์ทั่วไปของ superclass - */entity = (คลาส <t>) ((parameterizedType) this.getClass (). getGenericsuperClass ()). getActualTypeArguments () [0]; // fieldMeta FieldA = entity.getannotation (FieldMeta.Class); ฟิลด์ แต่ไม่รวมฟิลด์ที่สืบทอดมา* entity.getFields (); ส่งคืนเฉพาะฟิลด์สาธารณะที่เข้าถึงได้ทั้งหมดของคลาสหรืออินเตอร์เฟสที่แสดงโดยวัตถุ*ในคลาส getDeclared ** () วิธีการส่งคืนฟิลด์วิธีการ ฯลฯ ด้วยสิทธิ์การเข้าถึงทั้งหมด * ดู api * */field [] fields = entity.getDeclaredFields (); // สำหรับ (ฟิลด์ f: ฟิลด์) {// รับคำอธิบายประกอบที่มี fieldmeta fieldmeta meta = f.getannotation (fieldmeta.class); if (meta! = null) วิธีการสาธารณะที่เข้าถึงได้ทั้งหมดของคลาสหรืออินเทอร์เฟซที่แสดงโดยวิธีการวัตถุ [] วิธีการ = entity.getMethods (); สำหรับ (วิธีการ M: วิธีการ) {FieldMeta Meta = M.GetAnnotation (FieldMeta.class); ถ้า (meta! = null) {sortablefield sf = new sortablefield (meta, m.getName (), m.getReturntype () ในการใช้การเรียงลำดับ // collections.sort (รายการ, fieldsortcom ใหม่ ()); collections.sort (รายการ, ตัวเปรียบเทียบใหม่ <SortableField> () {@OverridePublic Int Compare (SortableField S1, Sortablefield S2) {return S1.getMeta () s1.getName (). compareto (s2.getName ()); // คุณยังสามารถใช้การเปรียบเทียบสำหรับการเปรียบเทียบ}});} return list;}} สร้างคลาสย่อยเพื่อสืบทอดคลาสฐาน:
เด็กชั้นเรียนสาธารณะขยายพาเรนต์ <Nano> {} คลาสทดสอบ:
Public Class Testannotation {@suppresswarnings ({"unchecked", "rawtypes"}) โมฆะคงที่สาธารณะหลัก (สตริง [] args) {พาเรนต์ c = เด็กใหม่ (); รายการ <sortablefield> รายการ = c.init (); "+l.getName ()+"/t ประเภทฟิลด์: "+l.getType ()+"/t ชื่อคำอธิบายประกอบ: "+l.getMeta (). ชื่อ ()+"/t คำอธิบายคำอธิบาย: "+l.getMeta (). คำอธิบาย ());}}}}}}- - - -
1. หลักการทำงานของคำอธิบายประกอบ:
JDK5.0 ให้ฟังก์ชั่นการเพิ่มความคิดเห็นช่วยให้นักพัฒนาสามารถกำหนดและใช้ประเภทคำอธิบายประกอบของตนเองได้ ฟังก์ชั่นนี้ประกอบด้วยไวยากรณ์ที่กำหนดประเภทคำอธิบายประกอบและไวยากรณ์ที่อธิบายการประกาศคำอธิบายประกอบ API ที่อ่านคำอธิบายประกอบไฟล์คลาสที่ใช้คำอธิบายประกอบเพื่อแก้ไขและเครื่องมือประมวลผลคำอธิบายประกอบ
คำอธิบายประกอบไม่ส่งผลโดยตรงต่อความหมายของรหัส แต่สามารถถือได้ว่าเป็นเครื่องมือหรือไลบรารีคลาสของโปรแกรม มันจะมีผลกระทบต่อความหมายของโปรแกรมการทำงาน
คำอธิบายประกอบสามารถอ่านได้หลายวิธีผ่านกลไกการสะท้อนในระหว่างการรันไทม์
2. @Override คำอธิบายประกอบ:
java.lang
ประเภทความคิดเห็นแทนที่
@target (value = method)
@retention (value = source)
การแทนที่ @Interface สาธารณะหมายความว่าการประกาศวิธีการตั้งใจที่จะแทนที่การประกาศวิธีการอื่นในซูเปอร์คลาส หากเมธอดหมายเหตุประกอบกับประเภทคำอธิบายประกอบนี้ แต่ไม่ได้แทนที่วิธี superclass คอมไพเลอร์จะสร้างข้อความแสดงข้อผิดพลาด
คำอธิบายประกอบ @Override หมายความว่าคลาสย่อยจำเป็นต้องแทนที่วิธีการที่สอดคล้องกันของคลาสแม่
Override เป็นคำอธิบายประกอบเครื่องหมายที่ใช้ในการระบุคำอธิบายประกอบ ชื่อคำอธิบายประกอบนั้นแสดงถึงข้อมูลที่จะมอบให้กับโปรแกรมเครื่องมือ
นี่คือตัวอย่างที่ใช้คำอธิบายประกอบ @Override:
คลาส A {รหัสสตริงส่วนตัว; A (id id) {this.id = id; } @Override สตริงสาธารณะ toString () {return id; -3. @deprecated คำอธิบายประกอบ:
java.lang
ประเภทความคิดเห็นที่เลิกใช้แล้ว
@documented
@Retention (value = runtime)
องค์ประกอบของโปรแกรมที่เลิกใช้งานสาธารณะ @Interface ที่มีคำอธิบายประกอบกับ @Deprecated โปรแกรมเมอร์จะไม่ยอมใช้องค์ประกอบดังกล่าวโดยปกติแล้วเป็นเพราะมันเป็นอันตรายหรือมีตัวเลือกที่ดีกว่า คอมไพเลอร์เตือนเมื่อใช้องค์ประกอบโปรแกรมที่ไม่ได้รับการอนุมัติหรือทำการเขียนใหม่ในรหัสที่ไม่ได้รับการอนุมัติ
ไม่แนะนำให้ใช้วิธีการแสดงคำอธิบายประกอบคำอธิบายประกอบ
เลิกใช้เป็นคำอธิบายประกอบเครื่องหมาย
นี่คือตัวอย่างที่ใช้คำอธิบายประกอบ @deprecated:
คลาส A {รหัสสตริงส่วนตัว; A (id id) {this.id = id; } @deprecated โมฆะสาธารณะ Execute () {system.out.println (id); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {a = ใหม่ a ("A123"); a.execute (); -4. @suppresswarnings คำอธิบายประกอบ:
java.lang
ความคิดเห็น typesuppresswarnings
@Target (value = {ประเภท, ฟิลด์, เมธอด, พารามิเตอร์, คอนสตรัคเตอร์, local_variable})
@retention (value = source)
public @Interface suppresswarnings ระบุว่าคำเตือนคอมไพเลอร์ที่ระบุควรไม่ได้แสดงในองค์ประกอบความคิดเห็น (และองค์ประกอบโปรแกรมทั้งหมดที่มีอยู่ในองค์ประกอบความคิดเห็นนั้น) โปรดทราบว่าชุดคำเตือนที่ไม่ได้แสดงในองค์ประกอบที่กำหนดนั้นเป็นคำเตือนทั้งหมดที่ไม่ได้แสดงในองค์ประกอบ ตัวอย่างเช่นหากคุณแสดงความคิดเห็นในชั้นเรียนเพื่อยกเลิกการเตือนและใส่คำอธิบายประกอบวิธีการที่จะยกเลิกการเตือนอีกครั้งคำเตือนทั้งสองจะไม่แสดงในวิธีนี้
ขึ้นอยู่กับสไตล์โปรแกรมเมอร์ควรใช้คำอธิบายประกอบนี้กับองค์ประกอบที่ซ้อนอยู่ด้านในสุดและจะใช้ได้เฉพาะเมื่อใช้ที่นั่น หากคุณต้องการยกเลิกการเตือนในวิธีการเฉพาะคุณควรแสดงความคิดเห็นวิธีการแทนชั้นเรียน
@suppresswarnings คำอธิบายประกอบหมายถึงคำเตือนการปราบปราม
นี่คือตัวอย่างที่ใช้ @SuppressWarnings Annotation:
@suppresswarnings ("ไม่ได้ตรวจสอบ") โมฆะคงที่สาธารณะหลัก (สตริง [] args) {list list = new ArrayList (); list.add ("abc");}5. คำอธิบายประกอบที่กำหนดเอง:
เมื่อใช้ @Interface เพื่ออธิบายคำอธิบายประกอบที่กำหนดเอง java.lang.annotation.annotation อินเตอร์เฟสจะได้รับการสืบทอดโดยอัตโนมัติและรายละเอียดอื่น ๆ จะเสร็จสมบูรณ์โดยคอมไพเลอร์โดยอัตโนมัติ เมื่อกำหนดคำอธิบายประกอบคำอธิบายประกอบหรืออินเทอร์เฟซอื่น ๆ ไม่สามารถสืบทอดได้
ปรับแต่งความคิดเห็นที่ง่ายที่สุด:
สาธารณะ @Interface myannotation {} ใช้คำอธิบายประกอบที่กำหนดเอง: คลาสสาธารณะ AnnotationTest2 {@myannotation โมฆะสาธารณะดำเนินการ () {system.out.println ("วิธี"); - 5.1. เพิ่มตัวแปร:
สาธารณะ @interface myannotation {สตริงค่า 1 ();} ใช้คำอธิบายประกอบที่กำหนดเอง: คลาสสาธารณะ AnnotationTest2 {@myannotation (value1 = "abc") โมฆะสาธารณะดำเนินการ () {system.out.println ("วิธี"); -เมื่อชื่อแอตทริบิวต์ที่ใช้ในคำอธิบายประกอบคือค่าอินเตอร์เฟสค่าแอตทริบิวต์สามารถเขียนได้โดยตรงโดยไม่ระบุชื่อของแอตทริบิวต์เมื่อกำหนด ยกเว้นชื่อตัวแปรที่ไม่คาดคิดชื่อตัวแปรทั้งหมดจะต้องได้รับการกำหนดโดยใช้ name = value
5.2. เพิ่มค่าเริ่มต้น:
public @interface myannotation {สตริงค่า 1 () ค่าเริ่มต้น "abc";}5.3. การแจงนับการใช้หลายตัวแปร:
public @Interface myannotation {สตริงค่า 1 () ค่าเริ่มต้น "ABC"; myenum value2 () default myenum.sunny;} enum myenum {ซันนี่, ฝน} ใช้คำอธิบายประกอบที่กำหนดเอง:
Public Class AnnotationTest2 {@myannotation (value1 = "a", value2 = myenum.sunny) โมฆะสาธารณะดำเนินการ () {system.out.println ("วิธี"); - 5.4. ตัวแปรอาร์เรย์:
public @Interface myannotation {string [] value1 () ค่าเริ่มต้น "abc";} ใช้คำอธิบายประกอบที่กำหนดเอง:
Public Class AnnotationTest2 {@myannotation (value1 = {"a", "b"}) โมฆะสาธารณะดำเนินการ () {system.out.println ("วิธี"); -6. ตั้งขอบเขตของคำอธิบายประกอบ:
@documented
@Retention (value = runtime)
@Target (value = Annotation_type)
การเก็บรักษาสาธารณะ @interface ระบุว่าควรเก็บคำอธิบายประกอบไว้นานเท่าใด หากคำอธิบายประกอบการเก็บรักษาไม่มีอยู่ในการประกาศประเภทความคิดเห็นนโยบายการเก็บรักษาเริ่มต้นเป็น ResentionPolicy.CLASS
ความคิดเห็นเมตาเป้าหมายนั้นใช้ได้เฉพาะเมื่อประเภทความคิดเห็นเมตาใช้โดยตรงสำหรับความคิดเห็น หากประเภทความคิดเห็นเมตาใช้เป็นสมาชิกประเภทความคิดเห็นอื่นมันจะไม่ถูกต้อง
การเก็บรักษา enum สาธารณะ
ขยายนโยบายการเก็บรักษาความคิดเห็นของ enum <retentionPolicy> ค่าคงที่สำหรับประเภท enum นี้อธิบายกลยุทธ์ที่แตกต่างกันสำหรับการแสดงความคิดเห็น พวกเขาจะใช้กับประเภทความคิดเห็น Meta การเก็บรักษาเพื่อระบุระยะเวลาของคำอธิบายประกอบ
ระดับ
คอมไพเลอร์จะบันทึกความคิดเห็นในไฟล์คลาส แต่ VM ไม่จำเป็นต้องแสดงความคิดเห็นในรันไทม์
รันไทม์
คอมไพเลอร์จะบันทึกความคิดเห็นในไฟล์คลาสและ VM จะเก็บความคิดเห็นไว้ที่รันไทม์ดังนั้นจึงสามารถอ่านได้
แหล่งที่มา
ความคิดเห็นที่จะทิ้งคอมไพเลอร์ @คำอธิบายประกอบการฟื้นฟูสามารถให้นโยบายการเก็บคำอธิบายประกอบสำหรับคอมไพเลอร์เมื่อกำหนดคำอธิบายประกอบ
คำอธิบายประกอบที่เป็นของนโยบายการเก็บรักษาชั้นเรียนคือ @suppresswarnings ซึ่งจะไม่ถูกเก็บไว้ในไฟล์. class
6.1. ตัวอย่างการใช้งานในคำอธิบายประกอบที่กำหนดเอง:
@retention (RetentionPolicy.class) สาธารณะ @interface myannotation {string [] value1 () ค่าเริ่มต้น "abc";}7. ตัวอย่างการใช้การสะท้อนเพื่ออ่านข้อมูลคำอธิบายประกอบของนโยบายการเก็บรักษารันไทม์:
java.lang.reflect
อินเตอร์เฟสคำอธิบายประกอบ
คลาสการใช้งานที่รู้จักทั้งหมด:
AccessibleObject, คลาส, คอนสตรัคเตอร์, ฟิลด์, วิธี, แพ็คเกจแสดงถึงองค์ประกอบที่แสดงความคิดเห็นของโปรแกรมที่ทำงานอยู่ใน VM นี้ อินเทอร์เฟซนี้อนุญาตให้อ่านความคิดเห็นแบบสะท้อนกลับ ความคิดเห็นทั้งหมดที่ส่งคืนโดยวิธีการในอินเทอร์เฟซนี้ไม่เปลี่ยนรูปและอนุกรม ผู้โทรสามารถปรับเปลี่ยนอาร์เรย์ที่ส่งคืนโดยผู้เข้าร่วมของสมาชิกที่ได้รับมอบหมาย สิ่งนี้จะไม่มีผลกระทบใด ๆ ต่ออาร์เรย์ที่ส่งคืนโดยผู้โทรอื่น ๆ
หากวิธีการในอินเทอร์เฟซนี้ส่งคืนความคิดเห็น (โดยตรงหรือโดยอ้อม) ที่มีสมาชิกชั้นเรียนที่ได้รับมอบหมายซึ่งอ้างอิงคลาสที่ไม่สามารถเข้าถึงได้ใน VM นี้การพยายามอ่านคลาสโดยการเรียกวิธีการส่งคืนโดยคลาสที่เกี่ยวข้องในความคิดเห็นที่ส่งคืนจะส่งผล
isannotationpresent
บูลีน isannotationpresent (คลาส <? ขยายคำอธิบายประกอบ> AnnotationClass) จะส่งคืนจริงหากความคิดเห็นของประเภทที่ระบุมีอยู่ในองค์ประกอบนี้มิฉะนั้นจะส่งกลับเท็จ วิธีนี้ส่วนใหญ่ออกแบบมาเพื่ออำนวยความสะดวกในการเข้าถึงความคิดเห็นของแท็ก
พารามิเตอร์:
AnnotationClass - วัตถุคลาสที่สอดคล้องกับประเภทคำอธิบายประกอบ
กลับ:
ส่งคืนจริงหากความคิดเห็นของประเภทความคิดเห็นที่ระบุมีอยู่ในวัตถุนี้มิฉะนั้นเท็จ
โยน:
nullpointerexception - หากคลาสคำอธิบายประกอบที่กำหนดเป็นโมฆะ
เริ่มต้นด้วยเวอร์ชันต่อไปนี้:
1.5
getannotation
<t ขยายคำอธิบายประกอบ> t getAnnotation (คลาส <t> คำอธิบายประกอบ) ส่งคืนความคิดเห็นเหล่านี้หากมีความคิดเห็นเกี่ยวกับประเภทที่ระบุขององค์ประกอบนี้มิฉะนั้นจะส่งคืนค่า NULL
พารามิเตอร์:
AnnotationClass - วัตถุคลาสที่สอดคล้องกับประเภทคำอธิบายประกอบ
กลับ:
หากความคิดเห็นของประเภทความคิดเห็นที่ระบุขององค์ประกอบที่มีอยู่ในวัตถุนี้ความคิดเห็นเหล่านี้จะถูกส่งคืนมิฉะนั้นเป็นโมฆะ
โยน:
nullpointerexception - หากคลาสคำอธิบายประกอบที่กำหนดเป็นโมฆะ
เริ่มต้นด้วยเวอร์ชันต่อไปนี้:
1.5
Getannotations
คำอธิบายประกอบ [] getAnnotations () ส่งคืนความคิดเห็นทั้งหมดที่มีอยู่ในองค์ประกอบนี้ (หากองค์ประกอบนี้ไม่ได้แสดงความคิดเห็นอาร์เรย์ที่มีความยาวเป็นศูนย์จะถูกส่งคืน) ผู้โทรของวิธีการสามารถแก้ไขอาร์เรย์ที่ส่งคืนได้ตามต้องการ สิ่งนี้จะไม่มีผลกระทบใด ๆ ต่ออาร์เรย์ที่ส่งคืนโดยผู้โทรอื่น ๆ
กลับ:
ความคิดเห็นทั้งหมดที่มีอยู่ในองค์ประกอบนี้
เริ่มต้นด้วยเวอร์ชันต่อไปนี้:
1.5
getDeclaredannotations
คำอธิบายประกอบ [] getDeclaredAnnotations () ส่งคืนความคิดเห็นทั้งหมดที่มีอยู่โดยตรงในองค์ประกอบนี้ ซึ่งแตกต่างจากวิธีอื่น ๆ ในอินเทอร์เฟซนี้วิธีนี้จะไม่สนใจคำอธิบายประกอบที่สืบทอดมา (หากไม่มีความคิดเห็นโดยตรงในองค์ประกอบนี้อาร์เรย์ของความยาวจะถูกส่งคืน) ผู้โทรของวิธีการสามารถแก้ไขอาร์เรย์ที่ส่งคืนได้ตามต้องการ สิ่งนี้จะไม่มีผลกระทบใด ๆ ต่ออาร์เรย์ที่ส่งคืนโดยผู้โทรอื่น ๆ
กลับ:
ความคิดเห็นทั้งหมดที่มีอยู่โดยตรงในองค์ประกอบนี้
เริ่มต้นด้วยเวอร์ชันต่อไปนี้:
1.5
นี่คือตัวอย่างของการใช้การสะท้อนกลับเพื่ออ่านข้อมูลคำอธิบายประกอบของนโยบายการเก็บรักษารันไทม์:
คำอธิบายประกอบที่กำหนดเอง:
@Retention (RETINGIENTPOLICY.RUNTIME) สาธารณะ @Interface myAnnotation {String [] value1 () ค่าเริ่มต้น "ABC";} ใช้คำอธิบายประกอบที่กำหนดเอง:
Public Class AnnotationTest2 {@MyAnnotation (value1 = {"A", "B"}) @Deprecated โมฆะสาธารณะดำเนินการ () {System.out.println ("Method"); - อ่านข้อมูลในคำอธิบายประกอบ:
โมฆะคงที่สาธารณะหลัก (String [] args) โยนความปลอดภัย Exception, nosuchmethodexception, unlegalargumentexception, unlendalaccessexception, InvocationTargetException {AnnotationTest2 AnnotationTest2 = ใหม่ AnnotationTest2 (); // อินสแตนซ์ getClass ของ AnnotationTest2Class <NannotationTest2> C = AnnotationTest2.class; // getMethodinstance วิธีวิธีวิธีวิธี = c.getMethod ("ดำเนินการ", คลาสใหม่ [] {}); // ตรวจสอบว่าวิธีนี้มีคำอธิบายประกอบ myannotation หรือไม่ถ้า (method.isannotationpresent (myannotation.class)) {// รับอินสแตนซ์คำอธิบายประกอบ myannotation ของวิธีนี้ myannotation myannotation = method.getannotation (myannotation.class); // ดำเนินการเมธอดวิธีการ (คำอธิบายประกอบ lematationTest2, วัตถุใหม่ [] {}); // รับสตริง myannotation [] value1 = myannotation.value1 (); System.out.println (ค่า 1 [0]); } // รับคำอธิบายประกอบทั้งหมดบนคำอธิบายประกอบของวิธีการ [] คำอธิบายประกอบ = method.getAnnotations (); สำหรับ (คำอธิบายประกอบคำอธิบายประกอบ: คำอธิบายประกอบ) {system.out.println (คำอธิบายประกอบ); -8. การใช้คำอธิบายประกอบที่ จำกัด :
คำอธิบายประกอบที่ จำกัด ใช้ @target
@documented
@Retention (value = runtime)
@Target (value = Annotation_type)
เป้าหมายสาธารณะ @interface กำหนดประเภทขององค์ประกอบโปรแกรมที่ใช้ประเภทคำอธิบายประกอบ หากความคิดเห็นเมตาเป้าหมายไม่มีอยู่ในการประกาศประเภทความคิดเห็นประเภทที่ประกาศสามารถใช้กับองค์ประกอบโปรแกรมใด ๆ หากความคิดเห็นของเมตาดังกล่าวมีอยู่คอมไพเลอร์จะบังคับใช้ขีด จำกัด การใช้งานที่ระบุ ตัวอย่างเช่นความคิดเห็นเมตานี้บ่งชี้ว่าประเภทการประกาศเป็นของตัวเองนั่นคือประเภทความคิดเห็นเมตา สามารถใช้กับการประกาศประเภทความคิดเห็นเท่านั้น:
@Target (ElementType.annotation_type) สาธารณะ @interface metaannotationtype {... } ความคิดเห็นเมตานี้บ่งชี้ว่าประเภทการประกาศสามารถใช้เป็นประเภทสมาชิกในการประกาศประเภทคำอธิบายประกอบที่ซับซ้อนเท่านั้น ไม่สามารถใช้โดยตรงสำหรับความคิดเห็น:
@Target ({}) สาธารณะ @Interface memberType {... } นี่เป็นข้อผิดพลาดในการรวบรวมเวลาที่บ่งชี้ว่าค่าคงที่ขององค์ประกอบจะปรากฏมากกว่าหนึ่งครั้งในความคิดเห็นเป้าหมาย ตัวอย่างเช่นความคิดเห็นเมตาต่อไปนี้ผิดกฎหมาย:
@Target ({ElementType.field, ElementType.Method, ElementType.field}) สาธารณะ @Interface Bogus {... } public enum elementType สาธารณะขยายประเภทองค์ประกอบของโปรแกรม enum <ElementType> ค่าคงที่ของประเภท enum นี้ให้การจำแนกองค์ประกอบง่าย ๆ ที่ประกาศในโปรแกรม Java
ค่าคงที่เหล่านี้ใช้กับประเภทความคิดเห็นเมตาเป้าหมายเพื่อระบุภายใต้สถานการณ์ที่ถูกกฎหมายในการใช้ประเภทความคิดเห็น
คำอธิบายประกอบ _type
การประกาศประเภทความคิดเห็น
ตัวสร้าง
คำสั่งวิธีการสร้าง
สนาม
การประกาศภาคสนาม (รวมถึงค่าคงที่การแจงนับ)
local_variable
การประกาศตัวแปรท้องถิ่น
วิธี
คำสั่งวิธีการ
บรรจุุภัณฑ์
คำสั่งแพ็คเกจ
พารามิเตอร์
การประกาศพารามิเตอร์
พิมพ์
คลาสอินเตอร์เฟส (รวมถึงประเภทความคิดเห็น) หรือการประกาศการแจงนับ
ตัวอย่างข้อ จำกัด เกี่ยวกับการใช้คำอธิบายประกอบ:
@Target (ElementType.Method) สาธารณะ @Interface myannotation {string [] value1 () ค่าเริ่มต้น "abc";}9. เพิ่มบันทึกลงในเอกสารช่วยเหลือ:
ในการเพิ่มข้อมูลคำอธิบายประกอบลงในไฟล์ API ในขณะที่สร้างไฟล์ javadoc คุณสามารถใช้ java.lang.annotation.documented
ประกาศเอกสารคำอธิบายประกอบการสร้างในคำอธิบายประกอบที่กำหนดเอง:
@DocumentedPublic @Interface myannotation {string [] value1 () ค่าเริ่มต้น "abc";} ใช้คำอธิบายประกอบที่กำหนดเอง:
Public Class AnnotationTest2 {@myannotation (value1 = {"a", "b"}) โมฆะสาธารณะดำเนินการ () {system.out.println ("วิธี"); -10. ใช้การสืบทอดในคำอธิบายประกอบ:
โดยค่าเริ่มต้นคำอธิบายประกอบจะไม่ได้รับมรดกเป็นคลาสย่อย คุณสามารถเพิ่ม java.lang.annotation.inotation ประกาศคำอธิบายประกอบเมื่อมีการใช้คำอธิบายประกอบที่กำหนดเอง
@documented
@Retention (value = runtime)
@Target (value = Annotation_type)
public @interface ที่สืบทอดมาระบุว่าประเภทคำอธิบายประกอบนั้นได้รับการสืบทอดโดยอัตโนมัติ หากคำอธิบายประกอบเมตาที่สืบทอดมานั้นมีอยู่ในการประกาศประเภทความคิดเห็นและผู้ใช้สอบถามประเภทความคิดเห็นในการประกาศคลาสและไม่มีความคิดเห็นประเภทนี้ในการประกาศคลาสประเภทความคิดเห็นจะถูกสอบถามโดยอัตโนมัติใน superclass ของคลาส กระบวนการนี้ซ้ำจนกว่าจะพบความคิดเห็นประเภทนี้หรือระดับสูงสุดของลำดับชั้นของชั้นเรียน หากไม่มี superclass มีคำอธิบายประกอบประเภทนั้นแบบสอบถามจะบ่งบอกว่าคลาสปัจจุบันไม่มีคำอธิบายประกอบดังกล่าว
โปรดทราบว่าหากคุณใช้ประเภทคำอธิบายประกอบเพื่อแสดงความคิดเห็นสิ่งอื่นนอกเหนือจากคลาสประเภทความคิดเห็นเมตานี้ไม่ถูกต้อง โปรดทราบด้วยว่าความคิดเห็นของเมตานี้ช่วยอำนวยความสะดวกในการสืบทอดความคิดเห็นจาก superclasses เท่านั้น มันไม่ถูกต้องสำหรับความคิดเห็นของอินเทอร์เฟซที่ใช้งาน
บทความข้างต้นพูดสั้น ๆ เกี่ยวกับคำอธิบายประกอบที่กำหนดเอง Java และการใช้การสะท้อนเพื่อรับคำอธิบายประกอบในระหว่างการรันไทม์เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น