." Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved.
." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
."
." This code is free software; you can redistribute it and/or modify it
." under the terms of the GNU General Public License version 2 only, as
." published by the Free Software Foundation.
."
." This code is distributed in the hope that it will be useful, but WITHOUT
." ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
." FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
." version 2 for more details (a copy is included in the LICENSE file that
." accompanied this code).
."
." You should have received a copy of the GNU General Public License version
." 2 along with this work; if not, write to the Free Software Foundation,
." Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
."
." Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
." or visit www.oracle.com if you need additional information or have any
." questions.
."
.TH javap 1 "04 May 2009"
." Generated from HTML by html2man (author: Eric Armstrong)

.LP
.SH "Name"
javap \- The Java Class File Disassembler
.LP
.RS 3

.LP
.LP
Disassembles class files.
.LP
.RE
.SH "SYNOPSIS"
.LP

.LP
.nf
\f3
.fl
javap [ \fP\f3options\fP\f3 ] class. . .
.fl
\fP
.fi

.LP
.SH "DESCRIPTION"
.LP

.LP
.LP
The \f3javap\fP command disassembles a class file. Its output depends on the options used. If no options are used, \f3javap\fP prints out the package, protected, and public fields and methods of the classes passed to it. \f3javap\fP prints its output to stdout. For example, compile the following class declaration:
.LP
.RS 3

.LP
.nf
\f3
.fl
import java.awt.*;
.fl
import java.applet.*;
.fl

.fl
public class DocFooter extends Applet {
.fl
        String date;
.fl
        String email;
.fl

.fl
        public void init() {
.fl
                resize(500,100);
.fl
                date = getParameter("LAST_UPDATED");
.fl
                email = getParameter("EMAIL");
.fl
        }
.fl

.fl
        public void paint(Graphics g) {
.fl
                g.drawString(date + " by ",100, 15);
.fl
                g.drawString(email,290,15);
.fl
        }
.fl
}
.fl
\fP
.fi
.RE

.LP
.LP
The output from \f3javap DocFooter\fP yields:
.LP
.RS 3

.LP
.nf
\f3
.fl
Compiled from DocFooter.java
.fl
public class DocFooter extends java.applet.Applet {
.fl
    java.lang.String date;
.fl
    java.lang.String email;
.fl
    public DocFooter();
.fl
    public void init();
.fl
    public void paint(java.awt.Graphics);
.fl
}
.fl
\fP
.fi
.RE

.LP
.LP
The output from \f3javap \-c DocFooter\fP yields:
.LP
.RS 3

.LP
.nf
\f3
.fl
Compiled from DocFooter.java
.fl
public class DocFooter extends java.applet.Applet {
.fl
    java.lang.String date;
.fl
    java.lang.String email;
.fl
    public DocFooter();
.fl
    public void init();
.fl
    public void paint(java.awt.Graphics);
.fl
}
.fl

.fl
Method DocFooter()
.fl
   0 aload_0
.fl
   1 invokespecial #1 <Method java.applet.Applet()>
.fl
   4 return
.fl

.fl
Method void init()
.fl
   0 aload_0
.fl
   1 sipush 500
.fl
   4 bipush 100
.fl
   6 invokevirtual #2 <Method void resize(int, int)>
.fl
   9 aload_0
.fl
  10 aload_0
.fl
  11 ldc #3 <String "LAST_UPDATED">
.fl
  13 invokevirtual #4 <Method java.lang.String getParameter(java.lang.String)>
.fl
  16 putfield #5 <Field java.lang.String date>
.fl
  19 aload_0
.fl
  20 aload_0
.fl
  21 ldc #6 <String "EMAIL">
.fl
  23 invokevirtual #4 <Method java.lang.String getParameter(java.lang.String)>
.fl
  26 putfield #7 <Field java.lang.String email>
.fl
  29 return
.fl

.fl
Method void paint(java.awt.Graphics)
.fl
   0 aload_1
.fl
   1 new #8 <Class java.lang.StringBuffer>
.fl
   4 dup
.fl
   5 invokespecial #9 <Method java.lang.StringBuffer()>
.fl
   8 aload_0
.fl
   9 getfield #5 <Field java.lang.String date>
.fl
  12 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
.fl
  15 ldc #11 <String " by ">
.fl
  17 invokevirtual #10 <Method java.lang.StringBuffer append(java.lang.String)>
.fl
  20 invokevirtual #12 <Method java.lang.String toString()>
.fl
  23 bipush 100
.fl
  25 bipush 15
.fl
  27 invokevirtual #13 <Method void drawString(java.lang.String, int, int)>
.fl
  30 aload_1
.fl
  31 aload_0
.fl
  32 getfield #7 <Field java.lang.String email>
.fl
  35 sipush 290
.fl
  38 bipush 15
.fl
  40 invokevirtual #13 <Method void drawString(java.lang.String, int, int)>
.fl
  43 return
.fl
\fP
.fi
.RE

.LP
.SH "OPTIONS"
.LP

.LP
.RS 3
.TP 3
\-help 
Prints out help message for \f3javap\fP. 
.TP 3
\-l 
Prints out line and local variable tables. 
.TP 3
\-public 
Shows only public classes and members. 
.TP 3
\-protected 
Shows only protected and public classes and members. 
.TP 3
\-package 
Shows only package, protected, and public classes and members. This is the default. 
.TP 3
\-private 
Shows all classes and members. 
.TP 3
\-Jflag 
Pass \f2flag\fP directly to the runtime system. Some examples: 
.RS 3

.LP
.nf
\f3
.fl
javap \-J\-version
.fl
javap \-J\-Djava.security.manager \-J\-Djava.security.policy=MyPolicy MyClassName
.fl
\fP
.fi
.RE
.TP 3
\-s 
Prints internal type signatures. 
.TP 3
\-c 
Prints out disassembled code, i.e., the instructions that comprise the Java bytecodes, for each of the methods in the class. These are documented in the 
.na
\f2Java Virtual Machine Specification\fP @
.fi
http://java.sun.com/docs/books/vmspec/. 
.TP 3
\-verbose 
Prints stack size, number of \f2locals\fP and \f2args\fP for methods. 
.TP 3
\-classpath path 
Specifies the path \f3javap\fP uses to look up classes. Overrides the default or the CLASSPATH environment variable if it is set. Directories are separated by colons. Thus the general format for \f2path\fP is: 
.nf
\f3
.fl
   .:<your_path>
.fl
\fP
.fi
For example: 
.nf
\f3
.fl
.:/home/avh/classes:/usr/local/java/classes
.fl
\fP
.fi
.TP 3
\-bootclasspath path 
Specifies path from which to load bootstrap classes. By default, the bootstrap classes are the classes implementing the core Java platform located in \f2jre/lib/rt.jar\fP and several other jar files. 
.TP 3
\-extdirs dirs 
Overrides location at which installed extensions are searched for. The default location for extensions is the value of \f2java.ext.dirs\fP. 
.RE

.LP
.SH "ENVIRONMENT VARIABLES"
.LP

.LP
.RS 3
.TP 3
CLASSPATH 
Used to provide the system a path to user\-defined classes. Directories are separated by colons, for example, For example: 
.RS 3

.LP
.nf
\f3
.fl
.:/home/avh/classes:/usr/local/java/classes
.fl
\fP
.fi
.RE
.RE

.LP
.SH "SEE ALSO"
.LP

.LP
.LP
javac(1), java(1), jdb(1), javah(1), javadoc(1)
.LP

.LP
 
