第1章 从对象到组件 1
第2章 类加载器体系结构 8
2.1 组装应用程序 8
2.2 类加载器结构的目标 11
2.2.1 透明性 11
2.2.2 可扩展性 11
2.2.3 功能丰富 12
2.2.4 可配置性 12
2.2.5 处理命名和版本冲突 12
2.3 显式和隐式类加载 13
2.3.1 用URLClassLoader显式加载 13
2.2.6 安全性 13
2.3.2 隐式类加载 14
2.3.3 引用类型与已引用类 15
2.3.4 ClassLoaderloadClass与ClassforName 15
2.3.5 加载非类资源 16
2.4 类加载器规则 17
2.4.1 一致性规则 17
2.4.2 委托规则 18
2.4.3 可见性规则 19
2.4.4 委托用作命名空间 19
2.4.5 非Singleton模式的静态字段 20
2.4.6 隐式加载隐藏了大多数细节 21
2.5 热部署 21
2.6 卸载类 25
2.7 引导类路径、扩展路径和类路径 26
2.7.1 类路径 27
2.7.2 扩展路径 28
2.7.3 引导类路径 29
2.8 调试类加载结构 30
2.8.1 改编应用程序 31
2.8.2 使用-verbose:class标志 31
2.8.3 改编内核API 32
2.9 倒置问题和上下文类加载器 35
2.10 小结 39
2.11 资源 40
第3章 类型信息和反射 41
3.1.1 二进制兼容性 42
3.1 二进制类格式 42
3.1.2 二进制类元数据 45
3.1.3 从二进制类到反射 47
3.2 反射 47
3.2.1 反射字段 49
3.2.2 get和getDeclared的区别 49
3.2.3 运行时出现的类型错误 51
3.2.4 反射方法 51
3.3 反射调用 52
3.3.1 反射启动器 53
3.3.2 包装基本类型 54
3.3.3 避开语言访问规则 55
3.3.4 反射调用引发的异常 59
3.4.1 用委托代替实现继承 60
3.4 动态代理 60
3.4.2 动态代理使委托通用化 61
3.4.3 实现InvocationHandler 62
3.4.4 实现转发处理程序 63
3.4.5 将InvocationHandler用作通用服务 64
3.4.6 处理InvocationHandler中的异常 65
3.4.7 客户程序或服务器都可安装代理 65
3.4.8 动态代理的优点 66
3.5 反射性能 67
3.6 包反射 69
3.6.1 设置包元数据 69
3.6.3 封装包 70
3.6.2 访问包元数据 70
3.6.4 版本控制机制的弱点 71
3.7 自定义元数据 71
3.8 小结 74
3.9 资源 74
第4章 串行化处理机制 75
4.1 串行化处理和元数据 75
4.2 串行化基础知识 76
4.2.1 串行化忽略的一些字段 78
4.2.2 串行化与类构造函数 79
4.3 使用readObject和writeObject 80
4.4 将流与类匹配 81
4.4.1 serialVersionUID 82
4.4.2 重写默认SUID 83
4.4.3 兼容的和不兼容的更改 84
4.5 显式管理可串化字段 85
4.5.1 0bjectInputStream.GetField应用提示 86
4.5.2 编写器对格式的处理 86
4.5.3 重写类元数据 88
4.5.4 性能问题 88
4.5.5 自定义类描述符 88
4.6 停用元数据 89
4.6.1 在defaultWriteObject后写入自定义数据 89
4.6.2 可外部化 90
4.6.3 用writeObject只写入原始数据:错误做法 91
4.7 对象图 93
4.7.1 用Transient关键字缩减图大小 94
4.7.2 保存标识 94
4.7.3 通过reset关键字来利用无用单元收集器 95
4.8 对象替换 96
4.8.1 流控制替换 96
4.8.2 类控制替换 99
4.8.3 替换的排序规则 100
4.8.4 控制图排序 104
4.9 查找类代码 106
4.9.1 RMI中的注解 107
4.9.2 RMIMarshalledObject 108
4.10 小结 109
4.11 资源 110
第5章 自定义类加载器 111
5.1 Java2安全性 112
5.2 自定义类加载器 115
5.2.1 1ava2之前的自定义类加载器 115
5.2.2 SDK1.2后的类加载 116
5.2.3 转换类加载器 117
5.3 协议处理程序 122
5.3.1 实现处理程序 123
5.3.2 安装自定义处理程序 125
5.3.3 加载器和处理程序之间的选择 127
5.4 为需要的加载器传递安全性 128
5.5 读取自定义元数据 129
5.5.2 可串行类用作属性 130
5.5.1 版本属性示例 130
5.5.3 在类加载时读取属性 133
5.5.4 调试支持 138
5.6 小结 138
5.7 资源 139
第6章 交互操作1:JNl 140
6.1 交互操作的原因 140
6.2 本机代码的危险 141
6.3 查找和加载本机代码 142
6.3.1 名称映射 143
6.3.2 类型映射 143
6.3.3 重载名 145
6.3.4 加载本机库 146
6.3.5 类加载器和JNI 147
6.3.6 加载本机库的常见错误 149
6.3.7 本机加载释疑 152
6.4 从C++调用Java 152
6.4.1 最小化往返次数 154
6.4.2 性能比较 156
6.4.3 JNI和反射调用的区别 157
6.5 JNI中的错误处理 159
6.5.1 本机代码中的故障 159
6.5.2 处理C++异常 159
6.5.3 从本机代码处理异常 160
6.6.1 与无用单元收集器的交互 163
6.6 资源管理 163
6.5.4 从本机代码抛出Java异常 163
6.6.2 管理本机资源 169
6.6.3 管理数组 170
6.6.4 管理字符串 174
6.7 小结 176
6.8 资源 176
第7章 生成式编程 177
7.1 使用生成式代码的原因 177
7.1.1 建立变性模型的面向对象的方法 178
7.1.2 按绑定时间进行分析 180
7.1.3 分离绑定时间和规范 180
7.1.4 选择规范语言 181
7.2.1 类型信息用作自由规范文档 182
7.2 用Java生成代码的原因 182
7.1.5 重用性的高需求 182
7.1.6 小型域分析很危险 182
7.2.2 类加载支持灵活绑定模式 183
7.2.3 易于生成Java源文件 183
7.2.4 易于生成Java二进制类 183
7.2.5 代码生成功能有利于提高性能 183
7.2.6 代码生成的责任级别 184
7.3 绑定时间和模式的分类 184
7.4 RMI中的代码生成 186
7.5 JSP中的代码生成 187
7.6 EJB中的代码生成 189
7.6.1 部署描述符 191
7.6.2 替补实现 193
7.7 生成强类型集合 194
7.8 生成自定义串行化代码 197
7.9 小结 201
7.10 资源 203
第8章 展望 204
8.1 当前状况 204
8.2 发展方向 205
8.3 资源 205
附录 A交互操作2:连接Java和Win32/COM 206
A.1 综述 206
A.2 半透明占位程序 207
A.3 平台差异 209
A.4.1 COM加载器 210
A.4 组件对象模型 210
A.4.2 COM类型信息 211
A.4.3 COM对象生存期 212
A.4.4 COM类型发现 213
A.4.5 COM错误处理 213
A.4.6 COM线程亲缘性 214
A.4.7 COM安全性 216
A.5 Win32动态链接库 216
A.5.1 DLL加载器 216
A.5.2 DLL类型信息 217
A.5.6 DLL线程亲缘性 218
A.5.5 DLL错误报告 218
A.5.4 DLL类型发现 218
A.5.3 DLL对象生存期 218
A.5.7 DLL安全性 219
A.6 编组体系结构 219
A.6.1 共享占位程序 219
A.6.2 通用占位程序 223
A.6.3 指令字符串 223
A.7 生成占位程序 225
A.7.1 生成共享占位程序 225
A.7.2 生成接口占位程序 228
A.8 小结 230
参考书目 231