SYNOPSIS

javap [options] classes

DESCRIPTION

The javap command is called "disassembler" because it takes apart class files and tells you what's inside them. We won't use it often but sometimes it is very useful to find out how a particular java statement works out, especially for inner classes and so on.

OPTIONS

-l: Prints out line and local variable tables.

-b: Ensures backward compatibility with javap in JDK 1.1.

-public: Shows only public classes and members.

-protected: Shows only protected and public classes and members.

-package: Shows only packages, protected, and public classes and members. This is the default.

-private: Shows all classes and members.

-J flag: Pass flag directly to the runtime system.

-s: Prints internal type signatures.

-c: Prints out disassembled code, i.e., the instrctions that comprise the Java bytecodes, for each of the methods in the class.

-classpath path: Specifies the path javap uses to look up classes.

-h: Generate code which can be put into a C language header file.

-verbose: Prints stack size, number of locals and args for methods.

-verify: Performs a partial verification of the class file.

-version: Prints out the javap version string.

EXAMPLES

This is a java class with an inner class:

 class OutterClass{
public int var1;
private int var2; public int getVar2(){return var2;}; class InnerClass{
public int ivar1;
private int ivar2; public int getSum(){return var1+var2+ivar1+ivar2;} }; };

Then compile it to the class file:

javac test.java

Unfortunately, it doesn't work since I didn't set the local environment of path and home. So I set path-jdk/bin and home-jdk.

So I got two bytetype class files OutterClass.class and OutterClass$InnerClass.class.

The output of javap OutterClass.class yields:

Compiled from "test.java"
class OutterClass {
public int var1;
OutterClass();
public int getVar2();
static int access$000(OutterClass);
}

The output of javap OutterClass$InnerClass.class yields:

Compiled from "test.java"
class OutterClass$InnerClass {
public int ivar1;
final OutterClass this$0;
OutterClass$InnerClass(OutterClass);
public int getSum();
}

In this way, we can understand how inner class works. Inner classes can access data in the scope in which they are defined, even if the fileds that would otherwise be private. In inner classes, we get the reference of the outer class in this way we can access their data. The outer class reference is set in the constructor. The compiler modifies all inner class constructors, adding a parameter for the outer class reference.

Inner classes are a phenomenon of the compiler, not the virtual machine. Inner classes are translated into regulat class files with & delimiting outer and inner class names, and the virtual mathine does not have any special knowledge about them.

However, the reference of the outer class can only access data that are declared public. How can inner classes access private data? We can find that there is a get method static int access$000(OutterClass);  generated by the compiler which would be used for the inner class to access their private data.

But there is a great security risk in it. If an inner class accesses a private data field, then it is possible to access that data field through other classes that are added to the package. But to do so requires skill and determination. A programmer can not accidentally obtain accesss but must intentionally build or modify a class file for that purpose.

Now let's have a look at the private parameter of javap.

The output of javap -private OutterClass.class yields:

Compiled from "test.java"
class OutterClass {
public int var1;
private int var2;
OutterClass();
public int getVar2();
static int access$000(OutterClass);
}

The output of javap -private OutterClass$InnerClass.class yields:

Compiled from "test.java"
class OutterClass$InnerClass {
public int ivar1;
private int ivar2;
final OutterClass this$0;
OutterClass$InnerClass(OutterClass);
public int getSum();
}

how to use javap command的更多相关文章

  1. How to decompile class file in Java and Eclipse - Javap command example(转)

    Ability to decompile a Java class file is quite helpful for any Java developer who wants to look int ...

  2. javap反编译解释外部类直接使用内部类private字段的原理

    2016-07-04 15:56:39 我们都知道: 1.内部类可以直接访问外部类的private字段和方法: 2.非静态内部类持有外部类的引用: 3.外部类可以直接访问内部类的private字段和方 ...

  3. 无限递归的构造器和javap使用指南

    无限递归的构造器和javap使用指南 public class ConstructorRecursion { ConstructorRecursion rc; { rc = newConstructo ...

  4. Beginning Scala study note(9) Scala and Java Interoperability

    1. Translating Java Classes to Scala Classes Example 1: # a class declaration in Java public class B ...

  5. java JNI 的实现(2)-java和C/C++的相互调用.

    目录 概述 一,java代码 二,稍微注意通过javah生成的'C/C++'.h头文件和源java代码的关系 三,在C/C++中实现java的native方法(完整C/C++) 1,修改age,即Ja ...

  6. JVM(五) class类文件的结构

    概述 class类文件的结构可见下面这样图(出处见参考资料),可以参照下面的例子,对应十六进制码,找出找出相应的信息. 其中u2 , u4 表示的意思是占用两个字节和占用四个字节,下面我们将会各项说明 ...

  7. Eclipse中使用javap运行配置详解

    javap是sun提供的对class文件进行反编译的工具 1.配置Run---external tools---external tools configurations 选择Program 新建ja ...

  8. 在eclipse中使用javap工具反汇编

    1.配置 Run---external tools---external tools configurations 选择Program 新建javap运行方式 设置location.workspace ...

  9. JDK的命令行工具系列 (二) javap、jinfo、jmap

    javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出publ ...

随机推荐

  1. Windows 8.1 应用再出发 - 几种常用控件

    本篇为大家简单介绍Windows 商店应用中控件的用法,为方便讲解,我们在文本控件和按钮控件这两类中分别挑选有代表性的控件进行详细说明. 1. 文本控件 (1) TextBlock TextBlock ...

  2. oracle 根据字段分组后,将组内的数据根据字段排序

    row_number() over(partition by 分组字段 order by 排序字段 desc)

  3. sublime text 3 技巧

    sublime text 技巧 学习目的:熟悉sublime快捷键和功能,改进自己的工作方式. 学习流程:先把视频中涉及到的技巧记录下,再完整的看一遍所有的菜单和功能. 前端开发工具技巧介绍-Subl ...

  4. opengl的mipmap

    压缩纹理是不能调用glGenerateMipmap生成mipmap的. DDS和PVR都不行. 强行调用会产生GL_INVALID_OPERATION的错误. PNG格式试验了glGenerateMi ...

  5. C#设计模式(12)——享元模式(Flyweight Pattern)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...

  6. GoDaddy自动续费信用卡被扣款后的退款方法

    今天突然收到信用卡被GoDaddy捐款的通知,上GoDaddy网站上一看,是去年购买后来没有使用的一个CA证书被自动续费了.原来在GoDaddy购买的CA证书默认是每年自动续费的,这是一个大坑啊! 当 ...

  7. 无环的visitor模式

    无环的访问者模式,是来改进原有访问者模式的不足之处的,是Robert C. Martin首次提出的.我们知道访问者模式的优点是为被访问继承体系动态添加行为,而无须改变继承体系.但是GOF访问者模式的缺 ...

  8. Mac OS X 安装ruby环境

    1.查看版本 $ ruby -v ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14] 2.查看源 $ gem ...

  9. thinkphp支持大小写url地址访问,不产生下划线

    from:http://www.111cn.net/phper/thinkPhp/57748.htm 一.在配置文件中开启了thinkphp的大小写识别功能,使链接大小写都可以正常访问: ‘URL_C ...

  10. Failed to initialize the Common Language Runtime

    今天在SQL Server 2008中执行存储过程的时候报以下错误: Msg , Level , State , Procedure usp_QueryRealTimeRoomInfo, Line F ...