AVAP เป็นเครื่องมือที่มาพร้อมกับ JDK คุณสามารถค้นหาได้ภายใต้ /bin ในไดเรกทอรีการติดตั้ง JDK คุณสามารถถอดรหัสรหัสหรือดู bytecode ที่สร้างโดยคอมไพเลอร์ Java วิเคราะห์กระบวนการดำเนินการรหัสและทำความเข้าใจกับงานภายใน JVM
รายการต่อไปนี้แสดงตัวเลือกที่ใช้กันทั่วไปและคำอธิบายฟังก์ชั่นของคำสั่ง Javap โปรด Google ฟังก์ชั่นเพิ่มเติมสำหรับฟังก์ชั่นเพิ่มเติม ผู้เขียนจะไม่อธิบายรายละเอียด
สรุปการใช้งาน
-ช่วย
-l ตารางของแถวและตัวแปร
-เปิดเผยเฉพาะวิธีการสาธารณะและโดเมน
-ได้รับการปกป้องเพียงส่งออกจากชั้นเรียนและสมาชิกที่ได้รับการป้องกันและสมาชิก
-แพคเกจเฉพาะแพ็คเกจที่สาธารณะและได้รับการป้องกันและสมาชิกซึ่งเป็นค่าเริ่มต้น
-p -Private Outputs ทุกชั้นเรียนและสมาชิก
-S Signature Type Type Output
-c ส่งออกรหัสที่ย่อยสลายตัวอย่างเช่นในแต่ละวิธีในคลาสคำสั่งที่มีจาวาไบต์
-ขนาดสแต็กเอาท์พุท VERBOSE จำนวนพารามิเตอร์วิธีการ
-Constants เอาท์พุทคงที่คงที่ค่าคงที่
กรณีศึกษา
คำสั่ง Javap สลายตัวไฟล์คลาสและกำหนดสิ่งที่จะส่งออกตามตัวเลือก หากไม่ได้ใช้ตัวเลือก Javap จะส่งออกแพ็คเกจในไฟล์คลาสการป้องกันและโดเมนสาธารณะในชั้นเรียนและวิธีการทั้งหมดในชั้นเรียน Javap จะส่งออกไปยังเอาต์พุตมาตรฐาน มาดูตัวอย่างนี้และคอมไพล์ครั้งแรก (Javac) คลาสต่อไปนี้
แพ็คเกจ com.thundersoft.metadata.test.kafka; นำเข้า org.apache.kafka.clients.consumer.consumerrecord; นำเข้า org.apache.kafka.clients.producer.kafkaproducer; org.apache.kafka.clients.producer.producerrecord; นำเข้า org.junit.test; นำเข้า java.util.arrays; นำเข้า java.util.properties; คลาสสาธารณะ kafkatest props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("acks", "all"); props.put ("retries", 0); props.put ("batch.size", 16384); props.put ("linger.ms", 1); props.put ("buffer.memory", 33554432); props.put ("key.serializer", "org.apache.kafka.common.serialization.stringserializer"); props.put ("value.serializer", "org.apache.kafka.common.serialization.stringserializer"); props.put ("value.serializer", "org.apache.kafka.common.serialization.stringserializer"); ผู้ผลิต <สตริง, สตริง> โปรดิวเซอร์ = ใหม่ kafkaproducer <> (อุปกรณ์ประกอบฉาก); สำหรับ (int i = 0; i <100; i ++) {producer.send (ใหม่ producerrecord <string, string> ("my-topic", integer.toString (i), integer.toString (i))); } producer.close (); } @Test โมฆะสาธารณะ testKafKaconsumer () {คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.put ("bootstrap.servers", "192.168.204.30:9092"); props.put ("group.id", "ทดสอบ"); props.put ("enable.auto.commit", "true"); props.put ("auto.commit.interval.ms", "1,000"); props.put ("key.deserializer", "org.apache.kafka.common.serialization.stringdeserializer"); props.put ("value.deserializer", "org.apache.kafka.common.serialization.stringdeserializer"); Kafkaconsumer <String, String> Consumer = New Kafkaconsumer <> (อุปกรณ์ประกอบฉาก); consumer.subscribe (array.aslist ("my-topic")); ในขณะที่ (จริง) {consumerrecords <string, string> records = cumener.poll (100); สำหรับ (consumerrecord <string, string> records: records) system.out.printf ("Offset = %s, key = %s, value = %s %n", record.topic (), record.key (), record.value ()); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (ผลรวม); -หลังจากพิมพ์ javap kafkatest บนบรรทัดคำสั่งผลลัพธ์ผลลัพธ์จะมีดังนี้
คลาสสาธารณะ com.thundersoft.metadata.test.kafka.kafkatest {สาธารณะ com.thundersoft.metadata.test.kafka.kafkatest (); Public Void TestProducer (); โมฆะสาธารณะ testkafkaconsumer (); โมฆะคงที่สาธารณะหลัก (java.lang.string []);}รวมกับกระบวนการดำเนินการคอมไพเลอร์การวิเคราะห์รหัส
ที่นี่เรามุ่งเน้นเฉพาะตรรกะรหัสภายในวิธีหลัก รหัสวิธีหลักมีดังนี้
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int a = 2; int b = 3; int sum = a*b; System.out.println (ผลรวม); -หลังจากพิมพ์ javap -c kafkatest บนบรรทัดคำสั่งผลลัพธ์ผลลัพธ์จะมีดังนี้
โมฆะคงที่สาธารณะหลัก (java.lang.string []); รหัส: 0: ICONST_2 1: ISTORE_1 2: ICONST_3 3: ISTORE_2 4: ILOAD_1 5: ILOAD_2 6: IMUL 7: ISTORE_3 8: getStatic #47 // ฟิลด์ java/lang/system.out: ljava/io/printstream; 11: iload_3 12: invokevirtual #54 // วิธี java/io/printstream.println: (i) v 15: return
เช่นเดียวกับในรหัสข้างต้นไอคอน it_2 และ iconst_3 แสดงค่าคงที่ 2 และ 3 ตามลำดับ ILOAD_1 และ ILOAD_2 ตามลำดับแสดงถึงคำจำกัดความของตัวแปรทั่วไปสองตัวคือ ILOAD_1 และ ILOAD_2 ตามลำดับแสดงถึงการโหลดตัวแปรสองตัวลงในสแต็กข้อมูล IMUL แสดงถึงการคูณของตัวแปรทั้งสองและผลลัพธ์จะถูกกำหนดให้กับตัวแปร ISTORE_3
ในระหว่างกระบวนการวิเคราะห์รหัสง่าย ๆ นี้โปสเตอร์ค้นพบเว็บไซต์สำหรับคำสั่งรวบรวม JVM และแชร์คำสั่ง JVM
สรุป
ผู้เขียนได้ทำกระบวนการวิเคราะห์รหัสอย่างง่ายโดยหวังว่าจะสามารถช่วยเหลือผู้ที่ถูกกำหนดให้เป็น Javap สามารถใช้เพื่อถอดรหัสและดู Bytecode ที่รวบรวมโดยคอมไพเลอร์ โดยทั่วไปไม่ค่อยมีการใช้มากนัก แต่มักใช้ Javap -C คำสั่งนี้ใช้เพื่อแสดงรายการคำสั่ง JVM ที่ดำเนินการโดยแต่ละวิธี มันเป็นตัวเลือกที่ดีในการแก้ข้อผิดพลาดข้อผิดพลาดตรรกะที่ยุ่งยาก นอกจากนี้ผ่านการเปรียบเทียบ bytecode และซอร์สโค้ดเราสามารถวิเคราะห์หลักการรวบรวมและกระบวนการดำเนินการรหัสของ Java เพื่อแก้ปัญหาระดับหลักการ Java ต่างๆ