- 浏览: 543152 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
. 电梯直达 楼主
发表于 2012-1-28 13:02:26 |只看该作者 |倒序浏览 Code 属性用于 method_info 结构中。
4. Exceptions : attribute_info 被替代为 :
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
5. InnerClasses : attribute_info 被替代为 :
InnerClasses_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_classes;
{ u2 inner_class_info_index;
u2 outer_class_info_index;
u2 inner_name_index;
u2 inner_class_access_flags;
} classes[number_of_classes];
}
6. Synthetic : attribute_info 被替代为 :
Synthetic_attribute {
u2 attribute_name_index; // 不用废话了吧 ?
u4 attribute_length; // 必须为 0
}
Synthetic 用在 field_info 、 method_info 中,
一个没有出现在源程序中的变量必须使用 Synthetic 标记。
7. LineNumberTable : attribute_info 被替代为 :
LineNumberTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 line_number_table_length;
{ u2 start_pc; // 代码数组中的开始处
u2 line_number; // 源文件中的行号 ( 对于每一非空行都有这么一项 )
} line_number_table[line_number_table_length];
}
LineNumberTable 用于 Code 属性中,通常用于调试。
8. LocalVariableTable : attribute_info 被替代为 :
LocalVariableTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 local_variable_table_length;
{ u2 start_pc;
u2 length; // 当解释到代码数组的 [start_pc,start_pc+length]
// 时变量必须被赋值 ??
u2 name_index;
u2 descriptor_index;
u2 index; // 到本地变量数组的一个索引
} local_variable_table[local_variable_table_length];
}
9. Deprecated : attribute_info 被替代为 :
Deprecated_attribute {
u2 attribute_name_index;
u4 attribute_length; // 必须为 0
}
当然也可以定义自己的属性,但要你自己的编译器和虚拟机实现。 JVM 将忽略自己不认可的属性。
以上是关于 Javaclass 文件的一个基本结构的分析。主要是对书上关于这一章的总结,同时参考了 : http://hi.baidu.com/52dege/blog/item/f33a3cf4092491dbf3d3854f.html 等网上资料。
看一个 java classfile 有助于我们理解的实际例子:
代码 1 :
[java] view plaincopyprint?
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "aaabbb";
String b = "aaabbb";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaabbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }
运行结果为 :true true
代码 2 :
[java] view plaincopyprint?
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "aaabbb";
String b = "aaa";
b += "bbb";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaa"; b += "bbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }
运行结果为 :false true
关于代码 1 和代码 2 的解释:
Java 编译器在生成 class 文件的时候对代码里面定义的字符串都会作为一个字符串常量存放在常量池中。
对于代码 1 中的 String a = "aaabbb"; 和 String b = "aaabbb"; 预处理在编译处理后, a 和 b 都指向了常量池里的 ”aaabbb” ,所以 a==b 是 true.
对于代码 2 中的 String b = "aaa"; b += "bbb"; 编译处理后会在常量池里面生成 ”aaa” 和 ”bbb”, 同时, b += "bbb"; 语句会导致 Jvm 去重新创建一个 string 对象,相当于 b=new String(“aaabbb”); 自然, aaa==bbb 是 false 。这也是为什么不推荐使用加号来拼接字符串了
发表于 2012-1-28 13:02:26 |只看该作者 |倒序浏览 Code 属性用于 method_info 结构中。
4. Exceptions : attribute_info 被替代为 :
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
5. InnerClasses : attribute_info 被替代为 :
InnerClasses_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_classes;
{ u2 inner_class_info_index;
u2 outer_class_info_index;
u2 inner_name_index;
u2 inner_class_access_flags;
} classes[number_of_classes];
}
6. Synthetic : attribute_info 被替代为 :
Synthetic_attribute {
u2 attribute_name_index; // 不用废话了吧 ?
u4 attribute_length; // 必须为 0
}
Synthetic 用在 field_info 、 method_info 中,
一个没有出现在源程序中的变量必须使用 Synthetic 标记。
7. LineNumberTable : attribute_info 被替代为 :
LineNumberTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 line_number_table_length;
{ u2 start_pc; // 代码数组中的开始处
u2 line_number; // 源文件中的行号 ( 对于每一非空行都有这么一项 )
} line_number_table[line_number_table_length];
}
LineNumberTable 用于 Code 属性中,通常用于调试。
8. LocalVariableTable : attribute_info 被替代为 :
LocalVariableTable_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 local_variable_table_length;
{ u2 start_pc;
u2 length; // 当解释到代码数组的 [start_pc,start_pc+length]
// 时变量必须被赋值 ??
u2 name_index;
u2 descriptor_index;
u2 index; // 到本地变量数组的一个索引
} local_variable_table[local_variable_table_length];
}
9. Deprecated : attribute_info 被替代为 :
Deprecated_attribute {
u2 attribute_name_index;
u4 attribute_length; // 必须为 0
}
当然也可以定义自己的属性,但要你自己的编译器和虚拟机实现。 JVM 将忽略自己不认可的属性。
以上是关于 Javaclass 文件的一个基本结构的分析。主要是对书上关于这一章的总结,同时参考了 : http://hi.baidu.com/52dege/blog/item/f33a3cf4092491dbf3d3854f.html 等网上资料。
看一个 java classfile 有助于我们理解的实际例子:
代码 1 :
[java] view plaincopyprint?
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "aaabbb";
String b = "aaabbb";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaabbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }
运行结果为 :true true
代码 2 :
[java] view plaincopyprint?
public class StringTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "aaabbb";
String b = "aaa";
b += "bbb";
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
public class StringTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "aaabbb"; String b = "aaa"; b += "bbb"; System.out.println(a == b); System.out.println(a.equals(b)); } }
运行结果为 :false true
关于代码 1 和代码 2 的解释:
Java 编译器在生成 class 文件的时候对代码里面定义的字符串都会作为一个字符串常量存放在常量池中。
对于代码 1 中的 String a = "aaabbb"; 和 String b = "aaabbb"; 预处理在编译处理后, a 和 b 都指向了常量池里的 ”aaabbb” ,所以 a==b 是 true.
对于代码 2 中的 String b = "aaa"; b += "bbb"; 编译处理后会在常量池里面生成 ”aaa” 和 ”bbb”, 同时, b += "bbb"; 语句会导致 Jvm 去重新创建一个 string 对象,相当于 b=new String(“aaabbb”); 自然, aaa==bbb 是 false 。这也是为什么不推荐使用加号来拼接字符串了
发表评论
-
使用Java调用谷歌搜索
2013-10-19 12:50 893转自:http://yangshangchuan.iteye ... -
走出类加载器迷宫
2013-10-16 14:22 681这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜 ... -
Log4j使用
2012-12-05 11:34 772... -
Java的JDBC数据库连接池实现方法
2012-09-14 10:20 734虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库 ... -
什么是线程安全和线程不安全
2012-08-23 14:49 790什么是线程安全和线程 ... -
线程运行栈信息的获取
2012-08-23 14:49 829线程运行栈信息的获取 ... -
log4j 获取行号
2012-08-23 14:50 1153log4jjava 今天看log4j的日志,突然注意到log ... -
javassist【动态改字节码】学习三
2012-08-23 14:50 2661这里举个简单的例子,来记录下如何用CtClass创建一个类,并 ... -
javassist【动态改字节码】学习二
2012-08-22 11:53 830写了个例子。 有一个类: Java代码 package ... -
javassist[动态改字节码]学习一
2012-08-22 11:52 889前段时间为了公司里的 ... -
JVM启动参数
2012-08-22 11:51 936一、标准参数 1.-server -client 虚拟机服务器 ... -
使用javassist动态注入代码
2012-08-22 11:33 782关于java字节码的处理,目前有很多工具,如bcel,asm。 ... -
利用javaassist修改Class文件
2012-08-22 11:22 1494我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的 ... -
JavaMail
2012-08-16 20:03 948在Java EE应用程序中,经常需要发送E-mail。Java ... -
让java变成脚本语言
2012-08-15 12:42 0今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改 ... -
JavaAgent
2012-08-13 23:43 1269-javaagent 这个JVM参数是JDK 5引进的. j ... -
在Eclipse RCP中实现控制反转(IoC)
2012-08-13 23:13 964摘要:这篇文章描述了 ... -
aop的几种实现方式
2012-08-05 21:14 9461 AOP各种的实现 AOP就是面向切面编程,我们可以从 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-28 21:36 594http://www.iteye.com/magazines/ ... -
使用 HttpClient 和 HtmlParser 实现简易爬
2012-05-01 17:57 1101使用 HttpClient 和 HtmlParse ...
相关推荐
11.java基础拾遗--匿名内部类语法详解.mp4
09.java基础拾遗--类的加载和对象的构造过程.mp4
10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4
Struts框架是在JSP+Servlet+Javabean模式的基础上发展起来的,为了解决JSP页面中Java代码混乱、Servlet和Javabean耦合度过高、程序复用性低等问题。Struts引入了一个中央控制器Servlet,Action类负责业务逻辑,Form...
Java JDK(Java Development Kit)是Java编程语言的核心组件,包含Java运行环境、编译器、类库以及各种工具,是开发者进行Java程序开发的基础。Java JDK 6.0是Oracle公司发布的一个重要版本,提供了许多新的特性和...
【Java基础】 Java语言是面向对象的编程语言,其基础包括语法、数据类型、变量、运算符、控制结构等核心概念。在"Java基础"部分,你可以学习到如何声明和初始化变量,如整型(int)、浮点型(float)、字符型(char)和...
#### 一、Java语言拾遗 ##### 1、Vector与ArrayList - **起源与版本**:`Vector` 类自 JDK 1.0 就已存在,从 Java 2 平台 v1.2 开始进行了改进,实现了 `List` 接口,使其成为 Java Collections Framework 的一...
基础拾遗 1.1. JavaScript 1.2. CSS 1.3. 浏览器 工程化与工具 2.1. webpack 2.2. Gulp 2.3. Linter 2.4. 静态类型(Typescript/Flow) 2.5. Babel 2.6. CSS预处理与模块化 性能优化 3.1. 加载性能 3.2. 运行时性能 ...
这个文件包含了Java开发工具集(Java Development Kit, JDK)中众多命令行工具和基础服务的实现,如编译器(javac)、反编译器(javap)、打包工具(jar)等。本文将深入探讨`tools.jar`的内容及其在Java开发中的...
第2章面向对象技术和建模基础 2.1面向对象方法 2.1.1面向对象方法的基本思想 2.1.2面向对象方法的发展 2.2面向对象的基本概念与特征 2.2.1面向对象的基本概念 2.2.2面向对象的主要特征 2.3面向对象分析 ....
2. **编程语言和框架**:可能涉及到主流编程语言(如Java、C++、Python)的基本语法和特性,以及常用的开发框架(如Spring、Django等)的应用。 3. **数据结构与算法**:理解并应用基本的数据结构(如数组、链表、...