AVAP هي أداة تأتي مع JDK. يمكنك العثور عليه تحت /bin في دليل تثبيت JDK. يمكنك فك تشفير الرمز ، أو عرض رمز Bytecode الذي تم إنشاؤه بواسطة برنامج التحويل البرمجي Java ، وتحليل عملية تنفيذ الكود ، وفهم العمل داخل JVM.
يسرد التالي الخيارات الشائعة الاستخدام وأوصاف الوظائف لأمر JAVAP. يرجى Google المزيد من الوظائف لمزيد من الوظائف. المؤلف لن يوضح ذلك.
ملخص الاستخدام
-يساعد
-L جدول صفوف الإخراج والمتغيرات
-الطلقة فقط تخرج الأساليب والمجالات العامة
-محمية فقط يخرج الفصول العامة والأعضاء العامة والمحمية
-بصل فقط يخرج الحزم والفئات والأعضاء العامة والمحمية ، وهو الافتراضي
-P- يخرج كل الفئات والأعضاء
-S SUTPINAL TYPE TYPE
-C يخرج الكود المتحلل ، على سبيل المثال ، في كل طريقة في الفصل ، تعليمة تحتوي على Java Bytecode ،
-حجم مكدس الإخراج فيروبز ، عدد معلمات الطريقة
-الإخراج الإخراج الثابت الثابت
دراسة حالة
يقوم أمر JAVAP بتحلل ملف الفئة ، ويحدد ما يجب الإخراج بناءً على الخيارات. إذا لم يتم استخدام الخيارات ، فسيقوم Javap بإخراج الحزمة في ملف الفصل ، والمجالات المحمية والعامة في الفصل ، وجميع الطرق في الفصل. سوف Javap إخراجها على الإخراج القياسي. دعونا نلقي نظرة على هذا المثال ونجمع الأول (Javac) الفئة التالية.
package com.thundersoft.metadata.test.kafka ؛ import org.apache.kafka.clients.consumer.consumerrecord ؛ import org.apache.kafka.clients.producer.kafkaproducer ؛ import org.apache.kafka.clients.producer.producer ؛ org.apache.kafka.clients.producer.producerRecord ؛ استيراد org.junit.test ؛ استيراد java.util.arrays ؛ استيراد java.util.properties ؛ الطبقة العامة kafkatest {test public void testproducer () {properties properies = new properies () ؛ 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") ؛ المنتج <string ، string> producer = new Kafkaproducer <> (الدعائم) ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {producer.send (new producerrecord <string ، string> ("my-topic" ، integer.toString (i) ، integer.toString (i)) ؛ } producer.close () ؛ } test public void testkafkaconsumer () {properties props = new properties () ؛ props.put ("bootstrap.servers" ، "192.168.204.30:9092") ؛ props.put ("group.id" ، "test") ؛ props.put ("enable.auto.commit" ، "true") ؛ props.put ("Auto.Commit.Interval.ms" ، "1000") ؛ 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 <> (الدعائم) ؛ المستهلك. بينما (صواب) {consumerRecords <string ، string> records = consumer.poll (100) ؛ لـ (consumerRecord <String ، String> Record: Records) System.out.printf ("Offset = ٪ S ، key = ٪ s ، value = ٪ s ٪ n" ، record.topic () ، record.key () ، record.value ()) ؛ }} public static void main (string [] args) {int a = 2 ؛ int b = 3 ؛ int sum = a*b ؛ system.out.println (sum) ؛ }}بعد كتابة javap kafkatest على سطر الأوامر ، تكون نتيجة الإخراج كما يلي
الفئة العامة com.thundersoft.metadata.test.kafka.kafkatest {public com.thundersoft.metadata.test.kafka.kafkatest () ؛ public void testProducer () ؛ public void testkafkaconsumer () ؛ الفراغ الثابت العام الرئيسي (java.lang.string []) ؛}جنبا إلى جنب مع عملية تنفيذ برنامج التحويل البرمجي
هنا نركز فقط على منطق الكود داخل الطريقة الرئيسية. رمز الطريقة الرئيسي هو كما يلي
public static void main (string [] args) {int a = 2 ؛ int b = 3 ؛ int sum = a*b ؛ system.out.println (sum) ؛ }بعد كتابة 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 // Field Java/lang/system.out: ljava/io/printstream ؛ 11: ILOAD_3 12: InvokeVirtual #54 // Method Java/IO/printstream.println: (i) v 15: return
كما في الكود أعلاه ، يمثل ICONST_2 و ICONST_3 الثوابت 2 و 3 على التوالي. يمثل ILOAD_1 و ILOAD_2 على التوالي تعريف متغيرين عاديين ، ILOAD_1 و ILOAD_2 على التوالي يمثلان تحميل متغيرين في مكدس البيانات ، ويمثل IMUL عملية الضرب للبرنامج للمتغيرين.
أثناء عملية تحليل هذا الرمز البسيط ، اكتشف الملصق موقعًا على شبكة الإنترنت لأوامر تجميع JVM وشارك أوامر JVM.
لخص
قام المؤلف بعملية تحليل رمز بسيطة عليها ، على أمل أن يساعد ذلك من المقدر أن يكونوا. يمكن استخدام javap لإزالة التجميع وعرض Bytecode المترجمة بواسطة المترجم. بشكل عام ، لا يتم استخدام الكثير ، ولكن غالبًا ما يتم استخدام Javap -C. يتم استخدام هذا الأمر لسرد تعليمات JVM التي تم تنفيذها بواسطة كل طريقة. إنه خيار جيد لحل أخطاء الخطأ المنطقية الصعبة. بالإضافة إلى ذلك ، من خلال مقارنة رمز Bytecode ورمز المصدر ، يمكننا بتحليل مبادئ التجميع بعمق وعملية تنفيذ الكود في Java لحل مختلف مشاكل مستوى مبدأ Java.