(9) 深入了解Java Class文件格式(八)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22205831
在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中, 我们主要讲解了什么是虚拟机, 这篇博客是对JVM的一个概述。 在随后的几篇文章中,一直在讲解class文件格式。 在今天这篇博客中, 将会继续讲解class文件中的其他信息。 在本文中, 将会讲解class文件中的最后一部分, 属性(attributes) 。 这里的属性和源文件中的属性不是一个概念。 在源文件中, 我们把在类中定义的字段也叫做属性。 而class文件中的属性, 可以看做是存储一些额外信息的数据结构。 下面我们就来介绍属性。
class文件中的attributes_count和attributes
ClassFile中的SourceFile属性
- package com.jg.zhang;
- public class Person {
- int age;
- int getAge(){
- return age;
- }
- }
反编译后的相关信息:
- public class com.jg.zhang.Person
- SourceFile: "Person.java"
- Constant pool:
- .........
- #20 = Utf8 SourceFile
- #21 = Utf8 Person.java
- .........
反编译结果中的 SourceFile: "Person.java" 一行是SourceFile属性的简单表示形式。 可以把它看做一个可读的attribute_info 。 下面常量池中的第20项的CONSTANT_Utf8_info是对这个属性的属性名(attribute_name_index)的描述 , 第21项的CONSTANT_Utf8_info是对源文件的文件名的描述。
ClassFile中的InnerClasses属性
Synthetic属性
- package com.jg.zhang;
- public class Person {
- static{
- System.out.println("static");
- }
- int age;
- int getAge(){
- return age;
- }
- }
反编译后的相关信息如下:
- {
- int age;
- flags:
- static {};
- .........
- public com.jg.zhang.Person();
- .........
- int getAge();
- .........
- }
由反编译结果可以看出, 编译器自动生成了静态初始化方法和构造方法。 可能是因为Synthetic属性是可选的(也就是说某个版本的编译器可以选择不加入Synthetic属性) ,所以在反编译后的结果中没有发现Synthetic属性。
ConstantValue属性
- package com.jg.zhang;
- public class Person {
- static final int a = 1;
- int age;
- int getAge(){
- return age;
- }
- }
反编译后的相关结果如下:
- ......
- Constant pool:
- #7 = Utf8 ConstantValue
- #8 = Integer 1
- {
- static final int a;
- flags: ACC_STATIC, ACC_FINAL
- ConstantValue: int 1
- .........
- }
可以看到, 源文件中的a字段, 是static final 的, 所以编译器为这个字段的filed_info生成了ConstantValue属性。 这个属性的示意图如下所示, 注意, 虚线范围内表示常量池区域:
Deprecated属性
- package com.jg.zhang;
- public class Person {
- int age;
- @Deprecated
- int getAge(){
- return age;
- }
- }
在getAge方法上使用了@deprecated 。 下面是反编译之后的相关信息:
- ......
- nstant pool:
- ......
- #18 = Utf8 Deprecated
- ......
- ......
- int getAge();
- flags:
- Deprecated: true
- ......
可以看到, 在getAge方法相关的信息中, 有一行 Deprecated: true , 这说明编译器在getAge方法的method_info中加入了Deprecated属性。 常量池第18项的CONSTANT_Utf8_info中存放的是Deprecated属性的属性名“Deprecated” 。
总结
(9) 深入了解Java Class文件格式(八)的更多相关文章
- (10) 深入了解Java Class文件格式(九)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22432599 经过前八篇关于class文件的博客, 关于class文件格式的内容也基本上讲 ...
- (7) 深入了解Java Class文件格式(六)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21888943 经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, ...
- (8) 深入理解Java Class文件格式(七)
转载:http://blog.csdn.net/zhangjg_blog/article/details/22091529 本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍. 本 ...
- (6) 深入理解Java Class文件格式(五)
前情回顾 本专栏的前几篇博文, 对class文件中的常量池进行了详细的解释. 前文讲解了常量池中的7种数据项, 它们分别是: CONSTANT_Utf8_info CONSTANT_NameAndTy ...
- (5) 深入理解Java Class文件格式(四)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21658415 前情回顾 在上一篇博客深入理解Java Class文件格式(三) 中, ...
- (4) 深入理解Java Class文件格式(三)
转载:http://blog.csdn.net/zhangjg_blog/article/details/21557357 首先, 让我们回顾一下关于class文件格式的之前两篇博客的主要内容. 在 ...
- (3) 深入理解Java Class文件格式(二)
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/21487287 在上一篇文章 深入理解Java Class文件格式(一) 中, 介绍了c ...
- Java语言基础(八)
Java语言基础(八) 一.数学运算 + - * / % (1)凡是byte short char类型都按int类型的计算 看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...
- java多线程系列(八)---CountDownLatch和CyclicBarrie
CountDownLatch 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线 ...
随机推荐
- 对Git的理解
GIT属于计算机软件,功能是分布式版本控制系统,字面意思还挺有意思的:愚蠢或不开心的人,首先呢,这款软件是免费的.这款软件是免费的.这款软件是免费的.(重要的地方要说三遍)即使它不是免费的,在我大天朝 ...
- Zookeeper学习笔记
ZK ID存放路径 /tmp/zookeeper/myid
- apachebench的简单使用1
ApacheBench是 Apache 附带的一个小工具,专门用于 HTTP Server 的benchmark testing,可以同时模拟多个并发请求. ab的基本格式: NAME ab - Ap ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
- 从PowerDesigner表字段的Name到EF实体类属性的Display Name(根据PowerDesigner生成EF实体类中文注释和验证元数据)
第一步:将PowerDesigner表字段的中文Name填入Comment中:工具-Execute Commands-Edit/Run Script... '********************* ...
- 如果空间不够的话,iOS发生这样的错误
2016-12-16 10:24:50.945 gpxj[2634:21323] Simulator user has requested new graphics quality: 10 2016- ...
- SVN迁项目
next -> 做为新项目检出,finish -> next -> finish -> 否,是
- win8.1 Framework3.5安装不上的问题
问题症状:安装的WIN8系统无法安装Framework,SQL等都有问题 解决误区:直接安装或者更新后在线安装(结果一样各种错误) 解决方法: 1.先gpedit.msc进入本地组策略管理,目录:计算 ...
- 新上市Lighthouse专用芯片TS3633规格介绍
背景介绍 Valve 有远大的愿景.它决心要把 SteamVR 追踪系统推向世界,从虚拟现实里的空间定位,到机器人领域,Valve 想为各种环境下的跟踪应用提供支持. 上个月,Valve 方面宣布会把 ...
- Leetcode: Poor Pigs
There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...