JAVAP(1) دستورات JDK JAVAP(1)

javap-openjdk21 - دیس‌اسمبلر فایل‌های کلاس جاوا در OpenJDK 21

javap [گزینه‌ها] کلاس‌ها...

گزینه‌ها
گزینه‌های خط فرمان را مشخص می‌کند. بخش گزینه‌های javap (OPTIONS FOR JAVAP) را ببینید.
کلاس‌ها
یک یا چند کلاس جدا شده با فاصله را برای پردازش حاشیه‌نویسی‌ها (annotations) مشخص می‌کند. می‌توانید کلاسی را که در مسیر کلاس (class path) یافت می‌شود با نام فایل، نشانی URL یا نام کامل کلاس (fully qualified class name) مشخص کنید.

مثال‌ها:

path/to/MyClass.class

jar:file:///path/to/MyJar.jar!/mypkg/MyClass.class

java.lang.Object

دستور javap یک یا چند فایل کلاس را دیس‌اسمبل (بازگردانی بایت‌کد) می‌کند. خروجی به گزینه‌های استفاده‌شده بستگی دارد. در صورت عدم استفاده از گزینه‌ها، دستور javap فیلدها و متدهای محافظت‌شده (protected) و عمومی (public) کلاس‌های ارائه‌شده را چاپ می‌کند.

دستور javap قابلیت تشخیص فایل‌های چندنسخه‌ای JAR (چندنسخه‌ای / multirelease) را ندارد. استفاده از فرم مسیر کلاس (class path) برای دستور، باعث نمایش ورودی پایه (base entry) در تمام فایل‌های JAR می‌شود (چه چندنسخه‌ای باشند چه نباشند). با استفاده از فرم URL برای آرگومان، می‌توانید نسخه خاصی از یک کلاس را برای دیس‌اسمبل کردن مشخص نمایید.

دستور javap خروجی خود را در stdout چاپ می‌کند.

نکته:

در ابزارهایی که از گزینه‌های به سبک -- پشتیبانی می‌کنند، گزینه‌های به سبک GNU می‌توانند به‌جای فاصله، از علامت مساوی (=) برای جداسازی نام گزینه از مقدار آن استفاده کنند.

--help, -help , -h یا -?
پیام راهنمای دستور javap را چاپ می‌کند.
-version
اطلاعات نسخه انتشار را چاپ می‌کند.
-verbose یا -v
اطلاعات اضافی درباره کلاس انتخاب‌شده را چاپ می‌کند.
-l
جدول خطوط کد (line table) و متغیرهای محلی (local variable table) را چاپ می‌کند.
-public
فقط کلاس‌ها و اعضای عمومی (public) را نمایش می‌دهد.
-protected
فقط کلاس‌ها و اعضای محافظت‌شده (protected) و عمومی (public) را نمایش می‌دهد.
-package
کلاس‌ها و اعضای بسته/محافظت‌شده/عمومی (پیش‌فرض) را نمایش می‌دهد.
-private یا -p
تمام کلاس‌ها و اعضا را نمایش می‌دهد.
-c
کد دیس‌اسمبل‌شده را چاپ می‌کند؛ برای مثال، دستورالعمل‌هایی که بایت‌کدهای جاوا را برای هر یک از متدهای کلاس تشکیل می‌دهند.
-s
امضاهای نوع داخلی (internal type signatures) را چاپ می‌کند.
-sysinfo
اطلاعات سیستمی (مسیر، اندازه، تاریخ، هش SHA-256) کلاس در حال پردازش را نمایش می‌دهد.
-constants
ثوابت static final را نمایش می‌دهد.
--module module یا -m module
ماژول حاوی کلاس‌هایی را که باید دیس‌اسمبل شوند مشخص می‌کند.
--module-path path
محل یافتن ماژول‌های برنامه را مشخص می‌کند.
--system jdk
محل یافتن ماژول‌های سیستمی را مشخص می‌کند.
--class-path path, -classpath path یا -cp path
مسیری را مشخص می‌کند که دستور javap برای یافتن فایل‌های کلاس کاربر استفاده می‌کند. در صورت تنظیم، پیش‌فرض یا متغیر محیطی CLASSPATH را لغو (override) می‌کند.
-bootclasspath path
محل فایل‌های کلاس راه‌انداز (bootstrap class files) را بازنویسی (override) می‌کند.
--multi-release version
نسخه انتخابی در فایل‌های JAR چندنسخه‌ای را مشخص می‌کند.
-Joption
گزینه مشخص‌شده را به JVM ارسال می‌کند. برای مثال:

javap -J-version
javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName

بخش مرور گزینه‌های جاوا (Overview of Java Options) در java را ببینید.

کلاس HelloWorldFrame زیر را کامپایل کنید:


import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class HelloWorldFrame extends JFrame {
   String message = "Hello World!";
   public HelloWorldFrame(){
        setContentPane(new JPanel(){
            @Override
            protected void paintComponent(Graphics g) {
                g.drawString(message, 15, 30);
            }
        });
        setSize(100, 100);
    }
    public static void main(String[] args) {
        HelloWorldFrame frame = new HelloWorldFrame();
        frame.setVisible(true);
    }
}

خروجی حاصل از اجرای دستور javap HelloWorldFrame.class به صورت زیر است:


Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
  java.lang.String message;
  public HelloWorldFrame();
  public static void main(java.lang.String[]);
}

خروجی حاصل از اجرای دستور javap -c HelloWorldFrame.class به صورت زیر است:


Compiled from "HelloWorldFrame.java"
public class HelloWorldFrame extends javax.swing.JFrame {
  java.lang.String message;
  public HelloWorldFrame();
    Code:
       0: aload_0
       1: invokespecial #1        // Method javax/swing/JFrame."<init>":()V
       4: aload_0
       5: ldc           #2        // String Hello World!
       7: putfield      #3        // Field message:Ljava/lang/String;
      10: aload_0
      11: new           #4        // class HelloWorldFrame$1
      14: dup
      15: aload_0
      16: invokespecial #5        // Method HelloWorldFrame$1."<init>":(LHelloWorldFrame;)V
      19: invokevirtual #6        // Method setContentPane:(Ljava/awt/Container;)V
      22: aload_0
      23: bipush        100
      25: bipush        100
      27: invokevirtual #7        // Method setSize:(II)V
      30: return
  public static void main(java.lang.String[]);
    Code:
       0: new           #8        // class HelloWorldFrame
       3: dup
       4: invokespecial #9        // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: iconst_1
      10: invokevirtual #10       // Method setVisible:(Z)V
      13: return
}
2023 JDK 21