深入理解JVM--class类文件结构

一、平台无关性

    Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现。不仅使用Java编译器可以把Java代码编译成存储字节码的Class文件,使用JRuby等其他语言的编译器也可以把程序代码编译成Class文件,虚拟机并不关心Class的来源是什么语言,只要它符合一定的结构,就可以在Java中运行。Java语言中的各种变量、关键字和运算符的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更强大,这便为其他语言实现一些有别于Java的语言特性提供了基础,而且这也正是在类加载时要进行安全验证的原因。

二、查看class文件的工具

jclass lib:

使用jclass lib可以查看.class文件


如上图所示class文件包括:版本号version、常量池信息Conjstant Pool、访问标志Acsess Flag、当前类this_class、父类super_class、接口信息interfaces、字段Fields、方法Methods、属性Attributes,Methods包括code和异常信息。

具体的细节请参考【深入Java虚拟机】之二:Class类文件结构

使用文本工具打开class文件是一张码表


这张表展示的就是上面讲述的相关信息。


jd-gui

这是java反编译工具,可以通过class文件得到JAVA源码

我们可以通过结合使用这两个工具修改修改class文件

如何利用JClassLib修改.class文件


javap 指令

我们可以通过JDK自带的javap指令查看class文件

C:\>javap -help

Usage: javap <options> <classes>...

where options include:

   -c                      输出类中各方法的未解析的代码,即构成java字节码的指令

   -classpath <pathlist>       指定javap用来查找类的路径。目录用:分隔

   -extdirs <dirs>             覆盖搜索安装方式扩展的位置,扩展的缺省位置为jre/lib/ext

   -help                    输出帮助信息

   -J<flag>                  直接将flag传给运行时系统

   -l                       输出行及局部变量表

   -public                   只显示public类及成员

   -protected                只显示protected和public类及成员。

   -package                 只显示包、protected和public类及成员,,这是缺省设置

   -private                  显示所有的类和成员

   -s                        输出内部类型签名

   -bootclasspath <pathlist>    指定加载自举类所用的路径,如jre/lib/rt.jar或i18n.jar

   -verbose                 打印堆栈大小、各方法的locals及args参数,以及class文件的编译版本


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值