一、平台无关性
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文件
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文件的编译版本 |