คำนำ
ทุกคนรู้ว่าด้วยการใช้ Java8 จะมีการเพิ่มพารามิเตอร์วัตถุใหม่ลงในลายเซ็นวิธีการที่สอดคล้องกันเพื่อแสดงข้อมูลพารามิเตอร์เฉพาะ ชื่อพารามิเตอร์ที่เกี่ยวข้องสามารถรับได้ผ่าน getName นั่นคือเช่นเดียวกับที่เขียนไว้ในรหัสเช่นชื่อผู้ใช้เมื่อผ่านพารามิเตอร์ในเบื้องหน้าไม่จำเป็นต้องเขียนคำอธิบายประกอบเช่นคลาส @parameter ("ชื่อผู้ใช้") แต่สามารถแมปตามชื่อได้โดยตรง
การอ้างอิงรหัสต่อไปนี้จะแสดง:
คลาสสาธารณะ t {อินเตอร์เฟสส่วนตัว t2 {วิธีการเป็นโมฆะ (ชื่อผู้ใช้สตริง, รหัสผ่านสตริง); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {system.out.println (t.class.getMethod ("หลัก", สตริง []. คลาส) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("เมธอด", String.class, String.class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("เมธอด", String.class, String.class) .getParameters () [1] .getName ()); - ก่อน java8 คุณยังสามารถรับข้อมูลชื่อพารามิเตอร์ด้วยวิธีการบางอย่าง แต่วิธีการแตกต่างกัน ตัวอย่างเช่น ParameterMethodNameResolver ใน Spring MVC สามารถทำงานได้ตามปกติในเวอร์ชันก่อนหน้า อย่างไรก็ตามมันต้องมีการรวบรวมพิเศษเท่านั้น สิ่งที่ทำงานได้ที่นี่คือ LocalVariableTable และ MethodParameters ซึ่งรวบรวมไว้ในตารางตัวแปรท้องถิ่นและตารางพารามิเตอร์วิธีในภาษาจีน
ตารางตัวแปรท้องถิ่น LocalVariabletable
ตามข้อกำหนดของ JVM ตารางตัวแปรท้องถิ่นมีอยู่ในแอตทริบิวต์รหัสและแอตทริบิวต์รหัสยังเป็นแอตทริบิวต์ของ MethodInfo สามารถเข้าใจได้ว่าเมื่อวิธีการมีร่างกายวิธีการแอตทริบิวต์รหัสที่เกี่ยวข้องจะปรากฏขึ้น ในแอตทริบิวต์รหัสนอกเหนือจากการดำเนินการรหัสเฉพาะจะมีข้อมูลอื่น ๆ ตัวอย่างเช่น linenumberTable (ใช้เพื่ออธิบายตำแหน่งของแต่ละบรรทัดของรหัส)
ตารางตัวแปรโลคัลเป็นส่วนหนึ่งของข้อมูลการดีบักในวิธีการดังนั้นโดยค่าเริ่มต้นข้อมูลนี้จะไม่ถูกสร้างขึ้นในไฟล์คลาส ต้องเปิดสวิตช์ -G หรือ -G: VAVS โชคดีสำหรับการรวบรวม IDE หรือ MAVEN สวิตช์เหล่านี้จะเปิดขึ้นตามค่าเริ่มต้น ใน IDE คุณสามารถควบคุมได้โดยการตั้งค่า (สร้างข้อมูลการดีบักสำหรับแนวคิด) (ตรวจสอบเริ่มต้น) ใน Maven ไม่ว่าจะมีการควบคุมเอาต์พุตโดยการดีบักหรือ Debuglevel ในปลั๊กอิน Maven-Compiler-Plugin (ค่าเริ่มต้นเป็นจริง)
ตารางตัวแปรท้องถิ่นอยู่หลังจาก Javap ดังนี้:
// วิธีที่ไม่คงที่ localVariabletable: เริ่มต้นความยาวสล็อตชื่อลายเซ็น 0 1 0 นี้ lt นี้; 0 1 1 นับ j 0 1 3 ชื่อ ljava/lang/string; // วิธีการคงที่ localvariabletable: เริ่มต้นความยาวสล็อตชื่อลายเซ็น 0 101 0 args [ljava/lang/string;
ตารางตัวแปรท้องถิ่นไม่เพียง แต่บันทึกข้อมูลพารามิเตอร์เท่านั้น แต่ยังเก็บตัวแปรชั่วคราวที่อาจใช้ในร่างกายวิธีการทั้งหมดเช่น int ที่ประกาศแล้ว ฯลฯ และดังที่แสดงไว้ข้างต้นวิธีการและวิธีที่ไม่คงที่มีความแตกต่างระหว่างตัวแปรนี้ในตำแหน่งแรก ดังนั้นคุณสามารถอ่านจำนวนพารามิเตอร์ ( method.getParameterCount ) จากนั้นอ่านข้อมูลพารามิเตอร์ของหมายเลขที่ระบุในตารางตัวแปรโลคัลตามลายเซ็นวิธี
ควรสังเกตว่าในรูปด้านบนหากพารามิเตอร์ยาวหรือเป็นสองเท่าช่องของมันจะอยู่ที่ 2 สถานที่ เมื่อได้รับข้อมูลพารามิเตอร์ผ่านสล็อตต้องพิจารณาข้อมูลประเภทพารามิเตอร์
เนื่องจากวิธีการอินเตอร์เฟสไม่มีแอตทริบิวต์รหัสจึงไม่มีตารางตัวแปรท้องถิ่น หากคุณได้รับการกำหนดวิธีการของอินเทอร์เฟซคุณจะไม่สามารถรับชื่อพารามิเตอร์ที่เกี่ยวข้องผ่านตารางตัวแปรโลคัล
เมธอดพารามิเตอร์ตารางเมธอด
ตารางพารามิเตอร์เมธอดถูกนำมาใช้หลังจาก 1.8 ดังนั้นข้อมูลนี้มีเฉพาะในไฟล์คลาสที่รวบรวมด้วย JDK8 ซึ่งแตกต่างจากตารางตัวแปรท้องถิ่นมันเป็นของแอตทริบิวต์ MethodInfo นั่นคือมันอยู่ในระดับเดียวกับแอตทริบิวต์รหัส ไม่ว่าจะเป็นวิธีการอินเตอร์เฟสหรือวิธีการธรรมดามันมีแอตทริบิวต์นี้ ดังนั้นแม้แต่วิธีการอินเตอร์เฟสก็สามารถรับข้อมูลพารามิเตอร์ที่สอดคล้องกันได้
โดยค่าเริ่มต้นข้อมูลนี้ไม่สามารถใช้ได้ในชั้นเรียน จำเป็นต้องมีพารามิเตอร์การรวบรวมพิเศษ -พารามิเตอร์ในการสร้างและข้อมูลนี้ไม่ได้สร้างขึ้นตามค่าเริ่มต้นใน Idea และ Maven ในความคิดพารามิเตอร์การรวบรวมนี้จะต้องเพิ่มในพารามิเตอร์บรรทัดเพิ่มเติม Java ใน Maven พารามิเตอร์นี้จะต้องเพิ่มในพารามิเตอร์ compilerArgs ของ Maven-Compiler-Plugin
ตารางพารามิเตอร์วิธีการแสดงในรูปแบบต่อไปนี้หลังจาก Javap:
// วิธีการที่ไม่คงที่เมธอดพารามิเตอร์: ชื่อธงนับชื่อ // วิธีการแบบคงที่เมธอดพารามิเตอร์: ชื่อธง args
จะเห็นได้ว่าไม่ว่าจะเป็นแบบคงที่หรือไม่เฉพาะข้อมูลที่ใช้เพื่ออธิบายพารามิเตอร์จะปรากฏในตารางพารามิเตอร์ พารามิเตอร์การตั้งค่าสถานะต่อไปนี้ใช้ในสถานการณ์พิเศษบางอย่างเช่นพารามิเตอร์ final สำหรับวิธีการเขียนใหม่ ฯลฯ
เครื่องมือบางอย่างที่มีอยู่
นอกเหนือจากการใช้ชุดเครื่องมือ API และสปริงเนทีฟแล้วยังมีเครื่องมืออื่น ๆ ที่สามารถรับข้อมูลชื่อพารามิเตอร์ได้ ในระบบสปริงอินเทอร์เฟซที่ใช้อธิบายชื่อพารามิเตอร์คือ ParameterNameDiscoverer สามารถรับข้อมูลชื่อพารามิเตอร์ที่สอดคล้องกันได้ นอกจากนี้ Paranamer ใน com.thoughtworks.paranamer:paranamer ยังสามารถประมวลผลข้อมูลที่สอดคล้องกันได้ อย่างไรก็ตามการสนับสนุนสำหรับพารามิเตอร์ JDK8 นั้นไม่สูงมากและผู้ใช้สามารถบรรลุเป้าหมายของตนเองได้โดยขยายออกไป
สรุป
ข้างต้นเป็นวิธีการรับข้อมูลชื่อพารามิเตอร์ของรหัส Java สรุปโดยคุณ ฉันหวังว่ามันจะช่วยให้คุณเรียนรู้หรือใช้ Java หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร