คำนำ
รหัสทั้งหมดในบทความนี้เขียนด้วย JavaScript แต่คุณสามารถใช้ภาษาสคริปต์ที่เข้ากันได้กับ JSR 223 อื่น ๆ ได้ ตัวอย่างเหล่านี้สามารถเรียกใช้เป็นไฟล์สคริปต์หรือในเชลล์แบบอินเทอร์แอคทีฟโดยเรียกใช้คำสั่งทีละคำ ไวยากรณ์สำหรับการเข้าถึงคุณสมบัติและวิธีการของวัตถุใน JavaScript นั้นเหมือนกับภาษา Java
บทความนี้มีส่วนต่อไปนี้:
1. การเข้าถึงคลาส Java
ในการเข้าถึงประเภทเนทีฟหรือประเภทการอ้างอิง Java ใน JavaScript คุณสามารถเรียกฟังก์ชัน Java.type() ซึ่งส่งคืนประเภทของวัตถุที่เกี่ยวข้องตามชื่อที่ผ่านในคลาสเต็ม รหัสต่อไปนี้แสดงวิธีรับประเภทวัตถุที่แตกต่างกัน:
var arraylist = java.type ("java.util.arraylist"); var inttype = java.type ("int"); var stringarraytype = java.type ("java.lang.string []"); วิธีการส่งคืนวัตถุประเภทโดยใช้ฟังก์ชัน Java.type() ใน JavaScript นั้นคล้ายกับใน Java
ตัวอย่างเช่นคุณสามารถยกตัวอย่างคลาสโดยใช้วิธีการต่อไปนี้:
var anarraylist = new Java.type ("java.util.arraylist");วัตถุประเภท Java สามารถใช้ในการสร้างอินสแตนซ์วัตถุ Java รหัสต่อไปนี้แสดงวิธีการสร้างอินสแตนซ์วัตถุใหม่โดยใช้ตัวสร้างเริ่มต้นและเรียกตัวสร้างที่มีพารามิเตอร์:
var arraylist = java.type ("java.util.arraylist"); var defaultSizeArrayList = arrayList ใหม่; var CustomSizeArrayList = new ArrayList (16); คุณสามารถใช้วิธี Java.type() เพื่อรับประเภทวัตถุและคุณสามารถใช้วิธีการต่อไปนี้เพื่อเข้าถึงคุณสมบัติและวิธีการคงที่:
file var = java.type ("java.io.file"); file.createTempfile ("Nashorn", ".tmp"); หากคุณต้องการเข้าถึงคลาสสแตติกภายในคุณสามารถส่งสัญญาณดอลลาร์ไปยังวิธี Java.type()
รหัสต่อไปนี้แสดงวิธีการส่งคืนคลาสชั้นใน Float ของ java.awt.geom.Arc2D :
var float = java.type ("java.awt.geom.arc2d $ float");หากคุณมีวัตถุประเภทคลาสภายนอกอยู่แล้วคุณสามารถเข้าถึงคลาสด้านในได้เช่นเดียวกับที่คุณจะเข้าถึงคุณสมบัติดังที่แสดงด้านล่าง:
var arc2d = java.type ("java.awt.geom.arc2d") var float = arc2d.floatเนื่องจากเป็นคลาสภายในที่ไม่คงที่อินสแตนซ์ระดับภายนอกจะต้องส่งผ่านเป็นพารามิเตอร์ไปยังตัวสร้าง
แม้ว่าการใช้วัตถุประเภทใน JavaScript นั้นคล้ายกับใน Java แต่ก็ยังค่อนข้างแตกต่างจากวัตถุ java.lang.Class ความแตกต่างนี้คือค่าส่งคืนของวิธี getClass() คุณสามารถใช้ class และคุณสมบัติ static เพื่อรับข้อมูลนี้
รหัสต่อไปนี้แสดงความแตกต่างระหว่างสอง:
var arraylist = java.type ("java.util.arraylist"); var a = new ArrayList; // ทั้งหมดต่อไปนี้เป็นจริง: พิมพ์ ("ประเภททำหน้าที่เป็นเป้าหมายของอินสแตนซ์ของ:" + + (a.getClass ()! == arrayList)); print ("ประเภทของประเภท` คลาส `คุณสมบัติ` `property 'เหมือนกับ getClass ของอินสแตนซ์ ():" + (a.getClass () === arraylist.class)) พิมพ์ ("ประเภทเดียวกับ` คงที่'ไวยากรณ์และความหมายการแสดงออกของคลาส JavaScript และวัตถุรันไทม์คล้ายกับความหมายของ Java อย่างไรก็ตามใน Java วัตถุคลาสไม่มีคุณสมบัติชื่อคงที่เนื่องจากนิพจน์คลาสที่รวบรวมไม่ได้ใช้เป็นวัตถุ
2. นำเข้าแพ็คเกจและชั้นเรียน Java
ในการเข้าถึงคลาส Java ตามชื่อง่าย ๆ เราสามารถใช้ฟังก์ชัน importPackage() และ importClass() เพื่อนำเข้าแพ็คเกจและคลาส Java ฟังก์ชั่นเหล่านี้มีอยู่ในไฟล์สคริปต์ความเข้ากันได้ (mozilla_compat.js)
ตัวอย่างต่อไปนี้แสดงวิธีใช้ฟังก์ชัน importPackage() และ importClass() :
// โหลดสคริปต์ความเข้ากันได้ ("Nashorn: mozilla_compat.js"); // นำเข้า java.awt packageImportpackage (java.awt); // นำเข้า java.awt.frame classimportclass (java.awt.frame); SetVisible () MethodFrame.SetVisible (จริง); // เข้าถึง Javabean PropertyPrint (frame.title); แพ็คเกจ Java สามารถเข้าถึงได้ผ่านแพ็คเกจตัวแปรทั่วโลกเช่น Packages.java.util.Vector หรือ Packages.javax.swing.JFrame อย่างไรก็ตามแพ็คเกจ Java SE มาตรฐานมีวิธีการเข้าถึงที่ง่ายกว่าเช่น: java สอดคล้องกับ packages.java, javax สอดคล้องกับ packages.javax และ org สอดคล้องกับ packages.org
แพ็คเกจ java.lang ไม่จำเป็นต้องนำเข้าโดยค่าเริ่มต้นเนื่องจากสิ่งนี้จะขัดแย้งกับวัตถุในตัว JavaScript อื่น ๆ เช่น Object Boolean และ Math นอกจากนี้การนำเข้าแพ็คเกจและคลาส Java ใด ๆ อาจทำให้เกิดความขัดแย้งชื่อตัวแปรภายใต้ขอบเขตทั่วโลกของ JavaScript เพื่อหลีกเลี่ยงความขัดแย้งเรากำหนดวัตถุ Javaimporter และ จำกัด ขอบเขตของแพ็คเกจ Java และคลาสที่นำเข้าผ่าน with สั่งด้วยดังแสดงในรหัสต่อไปนี้:
// สร้างวัตถุ Javaimporter ที่มีแพ็คเกจและคลาสที่ระบุเพื่อนำเข้า Var Gui = ใหม่ javaimporter (java.awt, javax.swing); // ผ่านวัตถุ Javaimporter ไปยัง "พร้อม" คำสั่งและเข้าถึงคลาส // ใหม่จาก Frame -"Var Awtframe var jframe = new JFrame ("Swing JFrame");};3. ใช้อาร์เรย์ Java
ในการสร้างวัตถุอาร์เรย์ Java คุณต้องได้รับวัตถุประเภทอาร์เรย์ Java ก่อนและเริ่มต้น แอตทริบิวต์ไวยากรณ์และ length ของการเข้าถึง JavaScript ไปยังองค์ประกอบอาร์เรย์นั้นเหมือนกับ Java ดังที่แสดงในรหัสต่อไปนี้:
var stringarray = java.type ("java.lang.string []"); var a = new Stringarray (5); // ตั้งค่าขององค์ประกอบแรก [0] = "การเขียนสคริปต์ยอดเยี่ยม!"; // พิมพ์ความยาวของอาร์เรย์ ด้วยอาร์เรย์ JavaScript เรายังสามารถแปลงเป็นอาร์เรย์ Java โดยใช้วิธี Java.to() เราจำเป็นต้องผ่านอาร์เรย์ JavaScript เป็นพารามิเตอร์ไปยังวิธีการและระบุประเภทของอาร์เรย์ที่จะส่งคืนซึ่งอาจเป็นสตริงหรือวัตถุประเภท นอกจากนี้เรายังสามารถเพิกเฉยต่อพารามิเตอร์วัตถุประเภทเพื่อส่งคืนอาร์เรย์ [] อาร์เรย์ การดำเนินการแปลงจะดำเนินการตามกฎการแปลง ECMASCRIPT รหัสต่อไปนี้แสดงวิธีเปลี่ยนอาร์เรย์ JavaScript เป็นอาร์เรย์ Java ผ่านพารามิเตอร์ Java.to() ที่แตกต่างกัน:
// สร้างอาร์เรย์ JavaScript var anarray = [1, "13", false]; // แปลงอาร์เรย์เป็น java int [] array var javaintarray = java.to (anarray, "int []"); พิมพ์ (Javaintarray [0]); // พิมพ์หมายเลข 1print (Javaintarray [1]); // พิมพ์หมายเลข 13print (Javaintarray [2]); // พิมพ์หมายเลข 0 // แปลงอาร์เรย์ JavaScript เป็น javastringArray = java.to (anarray, java.type ("java.lang.string []")); print (javastringarray [0]); // พิมพ์สตริง "1" พิมพ์ (javastringArray [1]); // พิมพ์สตริง "13" พิมพ์ (javastringarray [2]); // พิมพ์สตริง "false" // แปลงอาร์เรย์ JavaScript เป็นวัตถุ Java [] array var javaobjectarray = java.to (anarray); print (javaobjectarray [0]); // พิมพ์หมายเลข 1print (javaobjectarray [1]); // พิมพ์สตริง "13" พิมพ์ (javaobjectarray [2]); // พิมพ์ค่าบูลีน "false" คุณสามารถใช้วิธี Java.from() เพื่อแปลงอาร์เรย์ Java เป็นอาร์เรย์ JavaScript
รหัสต่อไปนี้แสดงวิธีการแปลงอาร์เรย์ที่มีรายการไฟล์ในไดเรกทอรีปัจจุบันเป็นอาร์เรย์ JavaScript:
// รับไฟล์ประเภทไฟล์ java objectvar = java.type ("java.io.file"); // สร้างอาร์เรย์ java ของไฟล์ objectsvar listcurdir = ไฟล์ใหม่ (".") listfiles (); // แปลง Java Array เป็น JavaScript Array ArrayPrint (JSlist);สังเกต:
ในกรณีส่วนใหญ่คุณสามารถใช้วัตถุ Java ในสคริปต์ของคุณโดยไม่ต้องแปลงเป็นวัตถุ JavaScript
4. ใช้อินเทอร์เฟซ Java
ไวยากรณ์ของการใช้อินเทอร์เฟซ Java ใน JavaScript นั้นคล้ายกับวิธีการกำหนดคลาสที่ไม่ระบุชื่อใน Java เราเพียงแค่ต้องยกตัวอย่างอินเทอร์เฟซและใช้วิธีการด้วยฟังก์ชั่น JavaScript
รหัสต่อไปนี้แสดงให้เห็นถึงวิธีการใช้อินเทอร์เฟซ Runnable :
// สร้างวัตถุที่ใช้อินเทอร์เฟซ runnable โดยการใช้งาน // เมธอด run () เป็น JavaScript functionVar r = ใหม่ java.lang.runnable () {run: function () {print ("Running .../n"); }}; // ตัวแปร R สามารถส่งผ่านไปยังวิธี Java ที่คาดว่าจะมีการใช้งานวัตถุ // java.lang.runnable interfacevar th = ใหม่ java.lang.thread (r); th.start (); th.join (); หากวิธีการต้องการวัตถุวัตถุนี้จะใช้อินเทอร์เฟซด้วยวิธีเดียวเท่านั้นคุณสามารถส่งฟังก์ชันสคริปต์ไปยังวิธีนี้แทนที่จะส่งผ่านวัตถุ ตัวอย่างเช่นในตัวอย่างด้านบนตัวสร้าง Thread() ต้องการวัตถุที่ใช้อินเตอร์เฟส Runnable เป็นพารามิเตอร์ เราสามารถใช้ประโยชน์จากการแปลงอัตโนมัติเพื่อส่งฟังก์ชันสคริปต์ไปยังตัวสร้าง Thread()
ตัวอย่างต่อไปนี้แสดงวิธีสร้างวัตถุ Thread โดยไม่ต้องใช้อินเตอร์เฟส Runnable :
// กำหนดฟังก์ชันฟังก์ชัน JavaScript function func () {print ("ฉันเป็น func!");}; // ผ่านฟังก์ชัน JavaScript แทนวัตถุที่ใช้ // java.lang.runnable interfacevar th = new Java.lang.thread (func); th.start (); คุณสามารถใช้หลายอินเทอร์เฟซโดยผ่านวัตถุประเภทที่เกี่ยวข้องไปยังฟังก์ชั่น Java.extend()
5. ขยายคลาส Java นามธรรม
คุณสามารถสร้างอินสแตนซ์คลาสย่อยคลาสนามธรรมที่ไม่ระบุชื่อเพียงแค่ผ่านวัตถุ JavaScript ไปยังตัวสร้างซึ่งมีคุณสมบัติบางอย่างที่สอดคล้องกับค่าที่ใช้โดยวิธีการคลาสนามธรรม หากวิธีการมากเกินไปฟังก์ชั่น JavaScript จะให้การใช้งานของตัวแปรวิธีการทั้งหมด ตัวอย่างต่อไปนี้แสดงวิธีเริ่มต้นคลาสย่อยของ TimerTask คลาสนามธรรม:
var timertask = java.type ("java.util.timertask"); var task = new timertask ({run: function () {print ("Hello World!")}}); นอกเหนือจากการเรียกตัวสร้างและพารามิเตอร์ผ่านแล้วเรายังสามารถให้พารามิเตอร์โดยตรงหลังจากนิพจน์ new
ตัวอย่างต่อไปนี้แสดงวิธีใช้ไวยากรณ์นี้ (คล้ายกับคำจำกัดความของคลาสภายในที่ไม่ระบุชื่อใน Java) ซึ่งง่ายกว่าตัวอย่างด้านบน:
task var = ใหม่ timertask {run: function () {print ("Hello World!")}};หากคลาสนามธรรมมีวิธีนามธรรมเดียว (ประเภท SAM) เราไม่จำเป็นต้องผ่านวัตถุ JavaScript ไปยังตัวสร้างเราสามารถผ่านส่วนต่อประสานฟังก์ชันที่ใช้วิธีการ ตัวอย่างต่อไปนี้แสดงวิธีใช้ประเภท SAM เพื่อทำให้รหัสง่ายขึ้น:
task var = ใหม่ timertask (function () {print ("Hello World!")});โดยไม่คำนึงถึงไวยากรณ์ที่คุณเลือกหากคุณต้องการเรียกตัวสร้างที่มีพารามิเตอร์คุณสามารถระบุพารามิเตอร์ในวัตถุและฟังก์ชั่นการใช้งาน
หากคุณต้องการเรียกใช้เมธอด Java ที่ต้องใช้พารามิเตอร์ประเภท SAM คุณสามารถผ่านฟังก์ชัน JavaScript ไปยังวิธีการ Nashorn จะยกตัวอย่างคลาสย่อยตามความต้องการของวิธีการและใช้ฟังก์ชั่นนี้เพื่อใช้วิธีนามธรรมที่ไม่ซ้ำกัน
รหัสต่อไปนี้แสดงวิธีการเรียกใช้เมธอด Timer.schedule() ซึ่งต้องการวัตถุ TimerTask เป็นพารามิเตอร์:
var timer = java.type ("java.util.timer"); timer.schedule (function () {print ("Hello World!")});สังเกต:
ไวยากรณ์ก่อนหน้านี้สันนิษฐานว่าประเภท SAM ที่ต้องการเป็นอินเทอร์เฟซหรือมีตัวสร้างเริ่มต้นซึ่ง Nashorn ใช้เพื่อเริ่มต้นคลาสย่อย นี่เป็นไปไม่ได้ที่จะใช้คลาสที่ไม่มีตัวสร้างเริ่มต้น
6. ขยายคลาส Java เฉพาะ
เพื่อหลีกเลี่ยงความสับสนไวยากรณ์สำหรับการขยายคลาสนามธรรมไม่สามารถใช้เพื่อขยายคลาสคอนกรีต เนื่องจากคลาสคอนกรีตสามารถสร้างอินสแตนซ์ไวยากรณ์ดังกล่าวจะถูกแยกวิเคราะห์เป็นความพยายามที่จะสร้างอินสแตนซ์คลาสใหม่และส่งผ่านวัตถุของคลาสที่กำหนดโดยตัวสร้าง (หากประเภทวัตถุที่คาดหวังเป็นอินเทอร์เฟซ) เพื่อแสดงให้เห็นถึงปัญหานี้โปรดดูที่รหัสตัวอย่างต่อไปนี้:
var t = ใหม่ java.lang.Thread ({run: function () {print ("Thread Running!")}}); บรรทัดของรหัสนี้ถูกแยกวิเคราะห์เพื่อขยายคลาส Thread และใช้วิธี run() และการสร้างอินสแตนซ์ของคลาส Thread จะถูกส่งผ่านไปยังตัวสร้างวัตถุที่ใช้อินเตอร์เฟสที่ใช้งานได้
ในการขยายคลาสคอนกรีตให้ส่งวัตถุประเภทไปยังฟังก์ชัน Java.extend() จากนั้นส่งคืนวัตถุประเภทไปยังคลาสย่อย จากนั้นคุณสามารถใช้วัตถุประเภทของคลาสย่อยนี้เพื่อสร้างอินสแตนซ์และให้การใช้วิธีการเพิ่มเติม
รหัสต่อไปนี้จะแสดงวิธีขยายคลาส Thread และใช้วิธี run() :
var thread = java.type ("java.lang.Thread"); var theadextender = java.extend (เธรด); var t = new Threadextender () {run: function () {print ("Thread Running!")}}; ฟังก์ชั่น Java.extend() สามารถรับรายการของวัตถุหลายประเภท คุณสามารถระบุวัตถุประเภท Java ไม่เกินหนึ่งรายการหรือคุณสามารถระบุจำนวนวัตถุประเภทได้มากเท่ากับอินเตอร์เฟส Java วัตถุประเภทที่ส่งคืนจะขยายคลาสที่ระบุ (หรือ java.lang.Object หากไม่มีวัตถุประเภทที่ระบุ) คลาสนี้จะใช้อินเทอร์เฟซทั้งหมด ประเภทวัตถุของคลาสไม่จำเป็นต้องอยู่ที่ด้านบนของรายการ
7. วิธีการเข้าถึง superclass (คลาสแม่)
วิธีการที่ต้องการเข้าถึงคลาสแม่สามารถใช้ฟังก์ชัน Java .super()
ตัวอย่างต่อไปนี้แสดงวิธีการขยายคลาส java.lang.Exception และเข้าถึงวิธีการของคลาสแม่
ตัวอย่าง 3-1 วิธีการเข้าถึงคลาสพาเรนต์ (super.js) var exception = java.type ("java.lang.exception"); var exceptionAdapter = java.extend (ข้อยกเว้น); var exception = new EmponitionAdapter ("ข้อความยกเว้นของฉัน") return _super_.getMessage (). touppercase (); }} ลอง {throw exception;} catch (ex) {print (exception);}หากคุณเรียกใช้รหัสด้านบนคุณจะพิมพ์ต่อไปนี้:
jdk.nashorn.javaadapters.java.lang.exception: ข้อความยกเว้นของฉัน
8. ผูกพันกับการนำไปใช้กับชั้นเรียน
ในส่วนก่อนหน้าเราอธิบายวิธีการขยายคลาส Java และใช้อินเตอร์เฟสโดยใช้พารามิเตอร์วัตถุ JavaScript เพิ่มเติม การใช้งานจะถูกผูกไว้กับอินสแตนซ์เฉพาะซึ่งถูกสร้างขึ้นผ่านใหม่ไม่ใช่ทั้งคลาส มีประโยชน์บางอย่างในการทำสิ่งนี้เช่นรอยเท้าหน่วยความจำที่รันไทม์เนื่องจาก Nashorn สามารถสร้างอะแดปเตอร์สากลเดี่ยวสำหรับการรวมกันของแต่ละประเภท
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าอินสแตนซ์ที่แตกต่างกันอาจเป็นคลาส Java เดียวกัน แต่วัตถุการใช้งาน JavaScript ของพวกเขานั้นแตกต่างกัน:
var runnable = java.lang.runnable; var r1 = new runnable (function () {print ("ฉันวิ่งได้ 1!")}); var r2 = ใหม่ runnable (ฟังก์ชัน () {print ("ฉันวิ่ง 2!")}); r1.run () r2.class));รหัสด้านบนจะพิมพ์ผลลัพธ์ต่อไปนี้:
ฉันวิ่งได้ 1! ฉันวิ่งได้ 2! เราแชร์คลาสเดียวกัน: จริง
หากคุณต้องการผ่านอินสแตนซ์ของคลาสไปยัง API ภายนอก (เช่น Framework Javafx, ส่งผ่านอินสแตนซ์แอปพลิเคชันไปยัง Javafx API) คุณต้องขยายคลาส Java หรือใช้อินเทอร์เฟซที่ถูกผูกไว้กับคลาสนั้นแทนที่จะเป็นอินสแตนซ์ของมัน คุณสามารถใช้คลาสได้โดยผ่านการผูกวัตถุ JavaScript และส่งผ่านไปยังพารามิเตอร์สุดท้ายของฟังก์ชัน Java.extend () สิ่งนี้สร้างคลาสใหม่ที่มีตัวสร้างเดียวกันกับคลาสดั้งเดิมเนื่องจากไม่จำเป็นต้องใช้พารามิเตอร์วัตถุเพิ่มเติม
ตัวอย่างต่อไปนี้แสดงวิธีการผูกมัดการใช้งานในชั้นเรียนและแสดงให้เห็นว่าคลาสการใช้งานนั้นแตกต่างกันสำหรับการโทรที่แตกต่างกันในกรณีนี้:
var runnableimpl1 = java.extend (java.lang.runnable, function () {print ("ฉันรันได้ 1!")}); var runnableimpl2 = java.extend (java.lang.runnable, ฟังก์ชั่น (พิมพ์ runnableimpl2 (); r1.run (); r2.run (); พิมพ์ ("เราแบ่งปันคลาสเดียวกัน:" + (r1.class === r2.class));ผลการดำเนินการตัวอย่างข้างต้นมีดังนี้:
ฉันวิ่งได้ 1! ฉันวิ่งได้ 2! เราแชร์คลาสเดียวกัน: เท็จ
การย้ายวัตถุการใช้งานจากการเรียกสร้างตัวสร้างไปยังการเรียกใช้ฟังก์ชัน Java.extend() จะหลีกเลี่ยงพารามิเตอร์พิเศษที่จำเป็นในการเรียกตัวสร้าง การโทรแต่ละครั้งไปยังฟังก์ชั่น Java.extend() ต้องใช้วัตถุการใช้งานของคลาสที่ระบุเพื่อสร้างคลาสอะแดปเตอร์ Java ใหม่ คลาสอะแดปเตอร์ที่ใช้กับขอบเขตของคลาสยังสามารถใช้พารามิเตอร์ตัวสร้างเพิ่มเติมเพื่อแทนที่พฤติกรรมของอินสแตนซ์ที่เฉพาะเจาะจง ดังนั้นคุณสามารถรวมทั้งสองวิธีนี้: คุณสามารถจัดเตรียมส่วนหนึ่งของการใช้งาน JavaScript ในคลาสฐานจากนั้นส่งผ่านไปยังฟังก์ชัน Java.extend() และให้การใช้งานอินสแตนซ์ในวัตถุและส่งผ่านไปยังตัวสร้าง คำจำกัดความของฟังก์ชันบางอย่างของวัตถุจะถูกเขียนทับเมื่อวัตถุถูกกำหนดและส่งผ่านไปยังตัวสร้าง
รหัสต่อไปนี้แสดงให้เห็นถึงวิธีการเขียนทับฟังก์ชั่นของวัตถุขอบเขตคลาสโดยส่งฟังก์ชันไปยังตัวสร้าง:
var runnableimpl = java.extend (java.lang.runnable, function () {print ("ฉันรันได้ 1!")}); var r1 = ใหม่ runnableimpl (); var r2 = runnableimpl (new) (พิมพ์ (" (r1.class === r2.class));ผลการพิมพ์หลังจากตัวอย่างข้างต้นถูกดำเนินการดังนี้:
ฉันวิ่งได้ 1! ฉันวิ่งได้ 2! เราแชร์คลาสเดียวกัน: จริง
9. เลือกวิธีการโอเวอร์โหลดเมธอด
วิธี Java สามารถใช้งานได้มากเกินไปโดยใช้ประเภทพารามิเตอร์ที่แตกต่างกัน คอมไพเลอร์ Java (Javac) จะเลือกวิธีที่ถูกต้องในการดำเนินการตามเวลาคอมไพล์ การแยกวิเคราะห์วิธีการของ Java overloaded ใน Nashorn จะดำเนินการเมื่อมีการเรียกวิธีการ นอกจากนี้ยังเป็นวิธีการกำหนดวิธีที่ถูกต้องตามประเภทพารามิเตอร์ แต่ถ้าประเภทพารามิเตอร์ที่แท้จริงจะทำให้เกิดความคลุมเครือเราสามารถระบุตัวแปรโอเวอร์โหลดที่เฉพาะเจาะจงได้อย่างชัดเจน สิ่งนี้จะช่วยปรับปรุงประสิทธิภาพของการดำเนินการโปรแกรมเนื่องจากเอ็นจิ้น Nashorn ไม่จำเป็นต้องแยกแยะวิธีการโทรระหว่างการโทร
ตัวแปรที่โอเวอร์โหลดถูกเปิดเผยว่าเป็นคุณสมบัติพิเศษ เราสามารถอ้างถึงพวกเขาในรูปแบบของสตริงซึ่งมีชื่อวิธีและประเภทพารามิเตอร์และถูกล้อมรอบด้วยวงเล็บ
ตัวอย่างต่อไปนี้แสดงวิธีเรียกใช้เมธอด System.out.println() ด้วยตัวแปรพารามิเตอร์ Object เราส่งสตริง "สวัสดี" ไปยังมัน:
var out = java.lang.system.out; out ["println (object)"] ("hello");ในตัวอย่างข้างต้นการใช้ชื่อคลาสวัตถุเพียงอย่างเดียวนั้นเพียงพอเพราะเป็นลายเซ็นที่ระบุชื่อที่ถูกต้องโดยเฉพาะ กรณีที่คุณต้องใช้ชื่อคลาสเต็มคือฟังก์ชั่นตัวแปรที่โอเวอร์โหลดสองตัวใช้ประเภทพารามิเตอร์ที่แตกต่างกัน แต่ประเภทมีชื่อเดียวกัน (เป็นไปได้เช่นแพ็คเกจที่แตกต่างกันมีชื่อคลาสเดียวกัน)
10. ประเภทข้อมูลการแมป
การแปลงก่อนหน้าของ Java และ JavaScript ส่วนใหญ่ทำงานได้ดีอย่างที่คุณคาดหวัง ในบทก่อนหน้านี้เราได้กล่าวถึงการแมปประเภทข้อมูลง่าย ๆ ระหว่าง Java และ JavaScript ตัวอย่างเช่นข้อมูลประเภทอาร์เรย์สามารถแปลงได้อย่างชัดเจนฟังก์ชั่น JavaScript สามารถแปลงเป็นประเภท SAM โดยอัตโนมัติเมื่อส่งเป็นพารามิเตอร์ไปยังวิธี Java วัตถุ JavaScript แต่ละชิ้นใช้อินเทอร์เฟซ java.util.Map เพื่อให้ API ยอมรับการแมปโดยตรง เมื่อผ่านค่าไปยัง Java API พวกเขาจะถูกแปลงเป็นประเภทตัวเลขเป้าหมายที่คาดหวังซึ่งอาจเป็นประเภทการห่อหุ้มหรือประเภทข้อมูลดั้งเดิม หากประเภทเป้าหมายไม่แน่นอน (เช่นตัวเลข) คุณสามารถกำหนดให้เป็นประเภทตัวเลขเท่านั้นและจากนั้นจึงห่อหุ้มประเภทโดยเฉพาะเช่นสองเท่าจำนวนเต็มยาว ฯลฯ การเพิ่มประสิทธิภาพภายในทำให้ค่าตัวเลขของแพ็คเกจใด ๆ เพื่อนร่วมงานคุณสามารถส่งค่า JavaScript ใด ๆ ไปยัง Java API ไม่ว่าจะเป็นประเภทที่ห่อหุ้มหรือประเภทดั้งเดิมเนื่องจากอัลกอริทึมการแปลง ToNumber ของ JavaScript จะประมวลผลค่าโดยอัตโนมัติ หากวิธี Java ต้องการพารามิเตอร์ String หรือ Boolean วัตถุ JavaScript จะใช้การแปลง ToString และ ToBoolean เพื่อรับค่า
สังเกต:
เนื่องจากการพิจารณาการเพิ่มประสิทธิภาพประสิทธิภาพภายในสำหรับการดำเนินการสตริงสตริง JavaScript ไม่สอดคล้องกับประเภท java.lang.string หรือพวกเขาอาจเป็นประเภท java.lang.CharSequence หากคุณผ่านสตริง JavaScript ไปยังวิธี java ที่ต้องใช้พารามิเตอร์ java.lang.String ดังนั้นสตริง JavaScript คือ java.lang.String ประเภท แต่ถ้าลายเซ็นวิธี CharSequence ของคุณต้องการที่จะเป็นแบบทั่วไป
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นความช่วยเหลือในการศึกษาและการทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร