ชั้นเรียน
คลาสฟิลด์กำหนดวิธีการบางอย่างที่สามารถใช้ในการสืบค้นประเภทของฟิลด์และเพื่อตั้งค่าหรืออ่านค่าของฟิลด์ การรวมวิธีการเหล่านี้เข้ากับวิธีการสมาชิกที่สืบทอดมาช่วยให้เราสามารถค้นหาข้อมูลทั้งหมดเกี่ยวกับการประกาศฟิลด์และสามารถจัดการฟิลด์ของวัตถุหรือชั้นเรียนเฉพาะได้
วิธี getGenericType ส่งคืนอินสแตนซ์ประเภทที่แสดงถึงประเภทการประกาศของฟิลด์ สำหรับประเภทเล็กน้อยเช่นสตริงหรือ int วิธีการส่งคืนวัตถุคลาสที่เกี่ยวข้องเช่น String.class และ int.classo สำหรับประเภทพารามิเตอร์เช่นรายการ <stri ng> วิธีการส่งคืนอินสแตนซ์ของ parameterizedRype ตัวอย่างเช่นสำหรับประเภทเช่น T
เมธอด getType มรดกจะส่งคืนวัตถุคลาสของประเภทของฟิลด์ สำหรับประเภทเล็กน้อยวิธีการทำงานเช่นเดียวกับวิธี getGenericType หากประเภทที่ประกาศของฟิลด์เป็นประเภทพารามิเตอร์วิธี getType จะส่งคืนวัตถุคลาสที่สอดคล้องกันสำหรับการลบประเภทพารามิเตอร์นั่นคือวัตถุคลาสของประเภทดั้งเดิม ตัวอย่างเช่นสำหรับวัตถุที่ประกาศว่าเป็นรายการ <stri ng>, gettype จะกลับ Li St. Class หากประเภทที่ประกาศของฟิลด์เป็นตัวแปรประเภทวิธี getType จะส่งคืนวัตถุคลาสที่สอดคล้องกันสำหรับการลบตัวแปรประเภท ตัวอย่างเช่นสมมติว่ามีคลาส foo <ding> และสำหรับฟิลด์ที่ประกาศว่าเป็นประเภท t, Getding ype จะส่งคืนวัตถุ
วัตถุชั้นเรียน หาก foo ถูกประกาศว่าเป็น foo <ขยายหมายเลข> ดังนั้น ype ภายใต้ get จะส่งคืนหมายเลข class
เราสามารถใช้วิธี isenumconstant เพื่อสอบถามว่าฟิลด์เป็นค่าคงที่ของ enum หรือเราสามารถใช้วิธีการรับและตั้งค่าเพื่อรับและตั้งค่าของฟิลด์ วิธีการเหล่านี้ที่ยอมรับการอ้างอิงวัตถุและส่งคืนค่าวัตถุ ECT มีรูปแบบทั่วไปรวมถึงรูปแบบพิเศษเพิ่มเติมที่สามารถจัดการกับประเภทพื้นฐานโดยตรง วิธีการทั้งหมดเหล่านี้ยอมรับใบเสนอราคาเพื่อระบุวัตถุที่จะดำเนินการ สำหรับฟิลด์คงที่ใบเสนอราคาวัตถุนี้จะถูกละเว้นดังนั้นคุณสามารถตั้งค่าได้
ตั้งค่าเป็นโมฆะ วิธีการต่อไปนี้จะพิมพ์ค่าของฟิลด์สั้นของวัตถุ:
โมฆะสาธารณะคงที่ printshortfield (Object O, ชื่อสตริง) พ่น nosuchfieldexception, ungleclAccessException {ฟิลด์ฟิลด์ = o.getClass (). getField (ชื่อ); ค่าสั้น = (สั้น) ฟิลด์ get (o); System.out.println (ค่า);ค่าส่งคืนของวิธีการรับสามารถเป็นวัตถุใด ๆ ที่อ้างอิงโดยฟิลด์นี้ หากฟิลด์เป็นประเภทดั้งเดิมวิธีการจะส่งคืนวัตถุประเภท Wrapper ที่เหมาะสม สำหรับฟิลด์ "Hort-type ของเราวิธี GET จะส่งคืนวัตถุประเภทสั้นที่มีค่าของฟิลด์และเมื่อกำหนดให้กับค่าตัวแปรโลคัลค่าวัตถุจะไม่ถูกบ็อกซ์โดยอัตโนมัติ
การใช้วิธีการตั้งค่าคล้ายกัน วิธีการตั้งค่าฟิลด์สั้นเป็นค่าที่ให้ไว้อาจมีลักษณะเช่นนี้:
สาธารณะคงที่ VOI setShortfield (Object O, ชื่อสตริง, NV สั้น) โยน nosuchfieldException, Field Field Field Field Field = 0.GetClass (). GetField (ชื่อ); ฟิลด์. set (o .nv);
แม้ว่า SET จะยอมรับพารามิเตอร์ของประเภทวัตถุ แต่เราสามารถส่งผ่านค่าสั้น ๆ โดยตรงและห่อลงในวัตถุสั้นด้วยการแปลงการห่อหุ้ม
ในวิธีการข้างต้นหากโดเมนของวัตถุที่ระบุไม่สามารถเข้าถึงได้และการควบคุมการเข้าถึงนี้จะถูกบังคับใช้ข้อยกเว้นการจัดการผิดกฎหมายจะถูกโยนลงไป หากวัตถุที่ผ่านไปนั้นแตกต่างจากประเภทของโดเมนข้อยกเว้นที่ผิดกฎหมาย ExheralArgumentException จะถูกโยนลงไป หากโดเมนไม่คงที่และการอ้างอิงวัตถุที่ผ่านเป็น NULL จะมีการโยนข้อยกเว้น nullpointerexception การเข้าถึงโดเมนแบบคงที่อาจต้องใช้คลาสที่จะเริ่มต้นดังนั้นวิธีนี้จะทำให้เกิดข้อยกเว้นข้อยกเว้น
คลาสฟิลด์ยังมีวิธีการเฉพาะสำหรับการรับและการตั้งค่าประเภทพื้นฐาน ตัวอย่างเช่นเราสามารถเรียก GetPrimitive7ype และตั้งค่า primitive7ype บนวัตถุฟิลด์โดยที่ Primitive7ype เป็นชื่อประเภทพื้นฐาน (เป็นตัวพิมพ์ใหญ่) วิธีการรับสามารถใช้ในคำสั่งต่อไปนี้:
ค่าสั้น = field.getShhort (O);
วิธีการตั้งค่าสามารถใช้ในคำสั่งต่อไปนี้:
Field.setShort (O, NV);
การใช้วัตถุประเภท wrapper สามารถหลีกเลี่ยงได้ในงบที่ประกาศในสองวิธีข้างต้น
คลาสฟิลด์ใช้อินเทอร์เฟซหมายเหตุประกอบการกำหนดดังนั้นเรายังสามารถสอบถามและนำไปใช้กับโดเมนเช่นส่วนที่ 16.2
หมายเหตุเกี่ยวกับ
ด้วยวิธีการที่อธิบายไว้ข้างต้นเราสามารถใช้วัตถุฟิลด์เป็นวิธีจัดการกับค่าใด ๆ แต่เราควรพยายามหลีกเลี่ยง เนื่องจากภาษา Java จับข้อผิดพลาดในการเขียนโปรแกรมให้มากที่สุดเท่าที่จะเป็นไปได้ในช่วงระยะเวลาการรวบรวมของโปรแกรมจึงใช้วิธีการทางอ้อมที่น้อยลงเช่น "วัตถุ IELD" น้อยลงเมื่อเราเขียนโค้ด ยิ่งกว่านั้นเราจะเห็นได้ว่าในรหัสก่อนหน้านี้เพื่อที่จะทราบว่าจะเกิดอะไรขึ้นเราได้ใช้พลังงานในการอ่านรหัสมากกว่าเมื่อใช้ชื่อโดเมนโดยตรงในไวยากรณ์ทั่วไป
ฟิลด์สุดท้าย
โดยปกติการตั้งค่าฟิลด์ที่ประกาศขั้นสุดท้ายจะทำให้เกิดข้อผิดพลาดในการรับรู้ผิดกฎหมาย
ข้อยกเว้นนี่คือสิ่งที่เราคาดหวังได้เนื่องจากมูลค่าของฟิลด์สุดท้ายจะไม่เปลี่ยนแปลง แต่มีบางกรณีพิเศษ - ตัวอย่างเช่นใน deserialization ที่กำหนดเอง (ดูหัวข้อ 20.8.4) มันสมเหตุสมผลที่จะเปลี่ยนค่าของฟิลด์สุดท้ายซึ่งเราสามารถทำได้ผ่านการสะท้อนในฟิลด์อินสแตนซ์และเฉพาะในกรณีที่ setAccessible (จริง) ถูกเรียกใช้วัตถุสนาม โปรดทราบว่าไม่เพียงพอที่จะเรียกใช้งานได้ (จริง) ได้สำเร็จและต้องเรียกว่าแน่นอน
ความสามารถนี้มีไว้สำหรับบริบทที่มีความเชี่ยวชาญสูงและไม่ได้มีวัตถุประสงค์ทั่วไปและเราแนะนำเพื่อรักษาความสมบูรณ์ของเนื้อหาเท่านั้น หากคุณไม่ได้อยู่ในบริบทที่เฉพาะเจาะจงเช่น deserialization ที่กำหนดเองการเปลี่ยนค่าของฟิลด์สุดท้ายอาจนำไปสู่ผลที่ไม่คาดคิดหรือแม้กระทั่งความหายนะ นอกบริบทเหล่านี้ไม่มีการรับประกันว่าการเปลี่ยนแปลงฟิลด์สุดท้ายจะปรากฏให้เห็น แม้ในบริบทดังกล่าวมีความจำเป็นเพื่อให้แน่ใจว่ากลไกความปลอดภัยไม่ได้ขัดขวางการดำเนินการของรหัสเมื่อเข้ารหัสโดยใช้เทคโนโลยีนี้ การเปลี่ยนฟิลด์สุดท้ายด้วยค่าของตัวแปรคงที่ (ดูส่วนที่ 2.2.3) จะทำให้การเปลี่ยนแปลงนี้มองไม่เห็นเว้นแต่การแก้ไขดังกล่าวจะเกิดขึ้นได้โดยการใช้การสะท้อนกลับ
ชั้นเรียน
คลาสวิธีการและวิธีการที่สืบทอดมาจากคลาสสมาชิกช่วยให้เราได้รับข้อมูลที่สมบูรณ์เกี่ยวกับการประกาศวิธีการ:
"ประเภทสาธารณะ getGenericReturntypeo: วิธีนี้ส่งคืนวัตถุประเภทของประเภทการส่งคืนของวิธีการเป้าหมายหากวิธีการเป้าหมายถูกประกาศให้ส่งคืนโมฆะวิธีการกลับเป็นโมฆะ. classo
"ประเภทสาธารณะ [] getGenericParameterTypes (): วิธีนี้ส่งคืนอาร์เรย์ของประเภทวัตถุประเภทพารามิเตอร์ทั้งหมดของวิธีเป้าหมายซึ่งจะถูกเก็บไว้ในอาร์เรย์ในลำดับของการประกาศพารามิเตอร์หากวิธีการเป้าหมายไม่มีพารามิเตอร์ใด ๆ
.publ ic type [] getGeneri cacheti ontypes q: วิธีนี้ส่งคืนอาร์เรย์ของประเภทวัตถุประเภทข้อยกเว้นทั้งหมดที่ระบุไว้ในประโยคการโยนซึ่งจะถูกเก็บไว้ในอาร์เรย์ตามลำดับของการประกาศข้อยกเว้น
หากวิธีการเป้าหมายไม่ได้ประกาศข้อยกเว้นใด ๆ วิธีการจะส่งกลับอาร์เรย์ที่ว่างเปล่า
Java ยังมีวิธีการ getReturntype, getParametertypes และ getExceptionTypes วิธีการส่งคืน CL เป็น "วัตถุแทนที่จะเป็นประเภทวัตถุเช่นเดียวกับเมื่อใช้ field.getType ประเภทพารามิเตอร์และตัวแปรประเภทจะแสดงโดยวัตถุคลาสที่สอดคล้องกับการลบของพวกเขา
คลาส Method ใช้คำอธิบายประกอบและเราสามารถสอบถามคำอธิบายประกอบที่ใช้กับวิธีการตามที่กล่าวไว้ในส่วนที่ 16.2 นอกจากนี้คลาส Method ยังมี getParameterannotations เพื่อให้การเข้าถึงคำอธิบายประกอบที่ใช้กับพารามิเตอร์วิธีการ วิธี getParameterannotations สามารถส่งคืนอาร์เรย์คำอธิบายประกอบซึ่งแต่ละองค์ประกอบของอาร์เรย์ด้านนอกสุดสอดคล้องกับพารามิเตอร์ของวิธีการ; หากพารามิเตอร์ไม่มีคำอธิบายประกอบใด ๆ วิธีการจะส่งกลับอาร์เรย์คำอธิบายประกอบที่มีความยาว 0 สำหรับพารามิเตอร์นี้ หากวิธีการที่แสดงโดยวัตถุเมธอดนั้นเป็นองค์ประกอบคำอธิบายประกอบตัวเองเมธอด getDefaultValue จะส่งคืนวัตถุวัตถุที่แสดงค่าเริ่มต้นขององค์ประกอบ; หากวัตถุเมธอดเองไม่ใช่องค์ประกอบคำอธิบายประกอบหรือไม่มีค่าเริ่มต้นแล้ววิธีการจะส่งคืนคลาส null เมนต์คลาสยังใช้การจัดตั้งทั่วไปดังนั้นวิธีการ getTypeparameters จะถูกกำหนดซึ่งจะส่งคืนอาร์เรย์ของวัตถุ typeVariable หากวัตถุวิธีการที่กำหนดไม่ได้เป็นวิธีทั่วไปวิธีการส่งคืนอาร์เรย์ที่ว่างเปล่า
เราสามารถใช้วิธี isvarargs เพื่อตรวจสอบว่าวัตถุวิธีการเป็นวิธีดัชนีตัวแปรหรือไม่และวิธีการ i sbridge สามารถใช้เพื่อตรวจสอบว่ามันเป็นวิธีบริดจ์
วิธีที่น่าสนใจที่สุดในการใช้วัตถุวิธีการคือเรียกตัวเองว่าเป็นการสะท้อน:
.public Object เรียกใช้ (Object Onhis, Object … args) โยน ungleclAccessException, unlegalargumentException, argetException ภายใต้ nvocation: วิธีนี้เรียกวิธีการที่กำหนดโดยวัตถุวิธีการ ONSHIS วัตถุนี้และใช้ค่าของ ARGS เพื่อตั้งค่าพารามิเตอร์ของวิธีการที่เรียก สำหรับวิธีการที่ไม่คงที่ประเภทที่แท้จริงของ ONSHIS จะกำหนดว่าการใช้วิธีใดที่จะเรียกใช้ในขณะที่สำหรับวิธีการคงที่จะถูกละเว้นและมักจะถูกตั้งค่าเป็นโมฆะ จำนวนของค่าของ args จะต้องเหมือนกับจำนวนพารามิเตอร์จริงของวิธีที่เรียกว่าและประเภทของค่าเหล่านี้ทั้งหมดจะต้องได้รับการกำหนดให้กับพารามิเตอร์ของวิธีที่เรียกว่า มิฉะนั้นเราจะได้รับข้อยกเว้น LlegalargumentException โปรดทราบว่าพารามิเตอร์สุดท้ายของวิธีการอ้างอิงตัวแปรเป็นอาร์เรย์ดังนั้นเราต้องเติมอาร์เรย์ด้วยการอ้างอิง "ไม่แน่นอน" ที่เราต้องการผ่าน หากเราต้องการเรียกวิธีการที่เราไม่สามารถเข้าถึงได้วิธีนี้จะทำให้เกิดข้อยกเว้นที่ผิดกฎหมาย หากวิธีการที่เรียกว่าไม่ใช่วิธีการของวัตถุ ON วิธีการจะโยน llegalargumentexcepti โดยข้อยกเว้น หาก onhis เป็นโมฆะและไม่คงที่วิธีการจะโยนข้อยกเว้น 1pointerexception หากวัตถุวิธีการนี้แสดงถึงวิธีการคงที่และคลาสที่ประกาศวิธีการคงที่ยังคงอยู่ในสถานะที่จะเริ่มต้นวิธีการจะโยนข้อยกเว้นผู้ปฏิบัติงาน NitializerRorror หากวิธีการที่เรียกว่ามีพลังของมนุษย์ต่างดาวข้อยกเว้น InvocationTargetException จะถูกโยนลงไป
เมื่อเราใช้เมธอด Invoke เราสามารถผ่านประเภทพื้นฐานโดยตรงหรือเราสามารถใช้คลาส wrapper ที่เหมาะสม ประเภทที่แสดงโดยคลาส wrapper จะต้องกำหนดให้กับประเภทพารามิเตอร์ที่ประกาศโดยวิธีการ เราสามารถใช้การอ้างอิงแบบยาวลอยหรือสองครั้งเพื่อห่อการอ้างอิงแบบสองเท่า แต่เราไม่สามารถใช้การอ้างอิงสองครั้งหรือการอ้างอิงแบบลอยตัวได้เนื่องจากไม่สามารถกำหนดคู่ให้ยาวหรือข้าวโอ๊ตได้ วิธีการประมวลผลของวัตถุที่ส่งคืนโดยวิธีการเรียกใช้เหมือนกับ field.get ซึ่งส่งคืนประเภทพื้นฐานของคลาส wrapper ที่สอดคล้องกับพวกเขา หากวิธีการประกาศเป็นโมฆะวิธีการเรียกใช้จะส่งคืนค่า NULL
พูดง่ายๆเมื่อเราใช้วิธีเรียกใช้วิธีการโทรเราสามารถใช้พารามิเตอร์ทางกฎหมายในภาษา Java เท่านั้น
จัดลำดับความสำคัญที่มีประเภทและค่าเดียวกัน ตัวอย่างเช่นการโทรต่อไปนี้
return str.indexof (".", 8);สามารถเขียนในรูปแบบต่อไปนี้โดยใช้การสะท้อน:
Fas ที่โยนได้; ลอง {method indexm = string.class getMethod ("index0f", string.class, int.class); return (จำนวนเต็ม) indexm.invoke (str, ",", 8); } catch (nosuchmethodexception e) {failure = e; } catch (InvocationTargetException e) {fas = e .getCause (); } catch (unglegalAccessException e) {failure = e; } โยน fas;แม้ว่าการตรวจสอบความปลอดภัยของคอมไพเลอร์สำหรับการโทรโดยตรงสามารถทำได้เฉพาะเมื่อใช้ Invoke at Runtime เมื่อใช้การสะท้อน แต่รหัสที่อิงกับการสะท้อนกลับมีการตรวจสอบความปลอดภัยที่เทียบเท่ากับความหมายไปยังรหัสที่เรียกว่าโดยตรง การตรวจสอบการเข้าถึงอาจดำเนินการในวิธีที่แตกต่างกันเล็กน้อย - ผู้จัดการรักษาความปลอดภัยอาจปฏิเสธการเข้าถึงวิธีการในแพ็คเกจของเราแม้ว่าเราจะเรียกได้โดยตรง
เมื่อเราสามารถใช้การโทรแบบนี้เรามีเหตุผลที่ดีที่จะหลีกเลี่ยง แต่มันจะสมเหตุสมผลถ้าเราใช้วิธีการเรียกใช้หรือรับ/ตั้งค่าเมื่อเขียนดีบั๊กหรือแอปพลิเคชันทั่วไปอื่น ๆ ที่ต้องตีความการป้อนข้อมูลของผู้ใช้เป็นการทำงานบนวัตถุ วัตถุวิธีการสามารถใช้ในระดับหนึ่งเป็นตัวชี้วิธีการคล้ายกับในภาษาอื่น ๆ แต่เรามีเครื่องมือที่ดีกว่าโดยเฉพาะอย่างยิ่งอินเทอร์เฟซคลาสนามธรรมและคลาสซ้อนกันซึ่งสามารถใช้ในการจัดการกับปัญหาที่มักจะแก้ไขด้วยพอยน์เตอร์เมธอดในภาษาอื่น ๆ