java 密码格式_JVM详解之:java class文件的密码本

简介

一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。

变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。

机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。

下面,让我们开始这个激动人心的过程吧。

一个简单的class

为了深入理解java class的含义,我们首先需要定义一个class类:

public class JavaClassUsage {

private int age=18;

public void inc(int number){

this.age=this.age+ number;

}

}

很简单的类,我想不会有比它更简单的类了。

在上面的类中,我们定义了一个age字段和一个inc的方法。

接下来我们使用javac来进行编译。

IDEA有没有?直接打开编译后的class文件,你会看到什么?

没错,是反编译过来的java代码。但是这次我们需要深入了解的是class文件,于是我们可以选择 view->Show Bytecode:

20cf1620d66c46d1b4b1af856b949f31.png

当然,还是少不了最质朴的javap命令:

javap -verbose JavaClassUsage

对比会发现,其实javap展示的更清晰一些,我们暂时选用javap的结果。

编译的class文件有点长,我一度有点不想都列出来,但是又一想只有对才能讲述得更清楚,还是贴在下面:

public class com.flydean.JavaClassUsage

minor version: 0

major version: 58

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #2.#3 // java/lang/Object."":()V

#2 = Class #4 // java/lang/Object

#3 = NameAndType #5:#6 // "":()V

#4 = Utf8 java/lang/Object

#5 = Utf8

#6 = Utf8 ()V

#7 = Fieldref #8.#9 // com/flydean/JavaClassUsage.age:I

#8 = Class #10 // com/flydean/JavaClassUsage

#9 = NameAndType #11:#12 // age:I

#10 = Utf8 com/flydean/JavaClassUsage

#11 = Utf8 age

#12 = Utf8 I

#13 = Utf8 Code

#14 = Utf8 LineNumberTable

#15 = Utf8 LocalVariableTable

#16 = Utf8 this

#17 = Utf8 Lcom/flydean/JavaClassUsage;

#18 = Utf8 inc

#19 = Utf8 (I)V

#20 = Utf8 number

#21 = Utf8 SourceFile

#22 = Utf8 JavaClassUsage.java

{

public com.flydean.JavaClassUsage();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=2, locals=1, args_size=1

0: aload_0

1:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值