语言之美系列一 - Java篇

     受七周七语言、编程语言实现模式等读物启发,计划写一个语言之美系列博文,因为最近工作上用的比较多的语言是Java,所以先从它开刀,希望大家多提宝贵意见~

一. 泛型
(1). 泛型类并没有自己独有的Class类对象;
(2). 静态变量是被泛型类的所有实例所共享的;
(3). 泛型的类型参数不能用在Java异常处理的catch语句中;
(4). List<? extends Number>说明List中可能包含的元素类型是Number及其子类。而List<? super Number>则说明List中包含的是Number及其父类;
(5). 泛型继承体系:
a.相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。即List<String>是Collection<String>的子类型,List<String>可以替换Collection<String>。这种情况也适用于带有上下界的类型声明。
b.当泛型类的类型声明中使用了通配符的时候,其子类型可以在两个维度上分别展开。如对Collection<? extends Number>来说,其子类型可以在Collection这个维度上展开,即List<? extends Number>和Set<? extends Number>等;也可以在Number这个层次上展开,即Collection<Double>和 Collection<Integer>等。如此循环下去,ArrayList<Long>和
HashSet<Double>等也都算是Collection<? extends Number>的子类型。
c.如果泛型类中包含多个类型参数,则对于每个类型参数分别应用上面的规则。
(6). 在使用带通配符的泛型类的时候,需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的,很多操作是不允许的。
(7). 泛型类最好不要同数组一块使用。你只能创建new List<?>[10]这样的数组,无法创建new List<String>[10]这样的。这限制了数组的使用能力,而且会带来很多费解的问题。因此,当需要类似数组的功能时候,使用集合类即可。
二. 序列化
(1). 如何有选择的进行对象图的序列化,Transient? serialPersistentFields?
(2). 安全性问题? 从不同的层次来加强序列化的安全性。
Ⅰ.对序列化之后的流进行加密。这可以通过CipherOutputStream来实现。
Ⅱ.实现自己的writeObject和readObject方法,在调用defaultWriteObject之前,先对要序列化的域的值进行加密处理。
Ⅲ.使用一个SignedObject或SealedObject来封装当前对象,用SignedObject或SealedObject进行序列化。
Ⅳ.在从流中进行反序列化的时候,可以通过ObjectInputStream的registerValidation方法添加ObjectInputValidation接口的实现,用来验证反序列化之后得到的对象是否合法。
三. Proxy

       动态生成的代理类有如下一些特点:

(1). 包:如果所代理的接口都是 public 的,那么它将被定义在顶层包(即包路径为空),如果所代理的接口中有非 public 的接口(因为接口不能被定义为 protect 或 private,所以除 public 之外就是默认的 package 访问级别),那么它将被定义在该接口所在包,这样设计的目的是为了最大程度的保证动态代理类不会因为包管理的问题而无法被成功定义并访问;

(2). 类修饰符:该代理类具有 final 和 public 修饰符,意味着它可以被所有的类访问,但是不能被再度继承;

(3). 类名:格式是“$ProxyN”,其中 N 是一个逐一递增的阿拉伯数字,代表 Proxy 类第 N 次生成的动态代理类,值得注意的一点是,并不是每次调用 Proxy 的静态方法创建动态代理类都会使得 N 值增加,原因是如果对同一组接口(包括接口排列的顺序相同)试图重复创建动态代理类,它会很聪明地返回先前已经创建好的代理类的类对象,而不会再尝试去创建一个全新的代理类,这样可以节省不必要的代码重复生成,提高了代理类的创建效率.

      由此可见,受限于 Java 的语言的类继承机制,动态代理机制也有其局限,如它不能支持:
(1). 声明为 final 的类;
(2). 声明为 final 的函数;
(3). 构造函数均为 private 类型的类。

     要是我非要代理这些类呢? 别急,后面会有字节码操作大餐。。。

参考文献:
1. http://download.oracle.com/javase/6/docs/platform/serialization/spec/serialTOC.html
2. http://download.oracle.com/javase/6/docs/platform/rmi/spec/rmiTOC.html
3. http://tutorials.jenkov.com/java-exception-handling/index.html

时间: 2024-12-31 14:20:09

语言之美系列一 - Java篇的相关文章

云上持续交付实践系列1 --- java 篇

本文会演示如何在CRP上编译并部署一个Java Web应用. 我的应用 技术栈 我的应用是一个简单的在线购书的网站.因为是示例,所以代码就只有简单的一个登陆界面和登陆以后的书目列表界面.代码库在https://code.aliyun.com/blade_1986/bookstore. 使用的技术栈如下: Gradle作为构建工具 Spring作为IOC容器及MVC框架 JUnit作为测试框架 Spring Test作为集成测试框架 Selenium作为功能测试工具 有兴趣的同学可以先把这个代码下

云上持续交付实践系列5 --- Ruby 篇

本文会演示如何在CRP上编译并部署一个Ruby应用. 相关技术栈和用到的网站 本文将以ruby-china为例,使用CRP平台实现该项目的编译.测试和最终部署. 1. Rails作为Web框架 2. Postgres作为数据库存储 3. Memcached作为分布式内存对象缓存系统 4. Redis作为Key-Value数据库 5. Elasticsearch则作为一个简单的搜索引擎 本次实践中为了更好地使用代码库服务,我们将ruby-china的代码迁移到了阿里云Code中,在Gemfile里

8个简单部分开启Java语言学习之路 附java学习书单_java

之前为大家推荐了java语言阅读书籍,下面为大家介绍从哪几个方面开始学习java语言,具体内容如下 1. Java语言基础      谈到Java语言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基本没有其它任何一本书可以超越它.该书的作者Bruce Eckel在网络上被称为天才的投机者,作者的<Thinking in C++>在1995年曾获SoftwareDevelopment J

CoreOS Fest 系列之第一篇:容器江湖

本文讲的是CoreOS Fest 系列之第一篇:容器江湖,[编者的话] 这是总结 CoreOS Fest 大会的三篇文章之一,主要介绍了 CoreOS 公司与 Docker 公司之争,新成立的 appc 规范委员会, Tectonic 平台, Kubernetes 项目. 最近在旧金山, Linux 容器已经显得非常有「钱」景,看起来每个人都想从这个有几十亿美金规模的新市场中分得一杯羹.多家创业公司和云主机公司已经或者即将召开有关容器的大会,包括 4 月 17 日召开的 Container Ca

云上持续交付实践系列3 --- Python 篇

云上持续交付实践系列3 --- Python 篇 阿里云持续交付平台CRP(Continuous Release Platform)作为一款开发人员手里的居家旅行,杀人越货的利器,必然有其广泛的应用场景.本文将会演示如何在如何使用阿里云持续交付平台部署一个Python应用.Python作为一种脚本语言,经常与多种语言一起配合完成某些复杂的功能,与此同时,其强大的第三方库又进一步拓展了Python的应用领域. 应用概述 本文涉及两个项目,分别为基于Python的在线爬虫以及基于node.js的we

CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig

本文讲的是CoreOS Fest 系列之第二篇: Systemd.Go.Calico.Sysdig,[编者的话]在 CoreOS Fest 第二天的会议中,演讲者展示了多个开源项目和工具,包括 Systemd 和 CoreOS . Go 语言和容器. Calico 项目. Sysdig 等. 在 CoreOS Fest 的第一天会议中,陆续介绍了 CoreOS 的架构.规划和规范.第二天的会议,演讲者展示了多个开源项目和工具,包括 systemd-nspawn . Calico 项目和 Sysd

java-Java语言程序设计第八版基础篇的编程练习

问题描述 Java语言程序设计第八版基础篇的编程练习 为什么按照下面的运行实例的数进行输入所得的结果却不同import java.util.Scanner; public class FutureInvestmentValue { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print(""Enter investment amount:"

【java开发系列】—— java输入输出流

前言 任何语言输入输出流都是很重要的部分,比如从一个文件读入内容,进行分析,或者输出到另一个文件等等,都需要文件流的操作.这里简单介绍下reader,wirter,inputstream,outputstream的使用方法.其实Apache commons里面有个方法IOUtils可是实现方便快捷的流拷贝,感兴趣的可以参考官方文档. JAVA的输入输出流有两种,一种是字节流(InPutStream,OutPutStream),一种是字符流(Reader,Writer). 字节流是普遍适用的,比如

【IPFS + 区块链 系列】 入门篇 - IPFS+IPNS+个人博客搭建

孔壹学院:国内区块链职业教育引领品牌. 作者:黎跃春,孔壹学院创始人,区块链.高可用架构师 微信:liyc1215 区块链博客:http://liyuechun.org 在阅读这篇文章之前,你需要先学习[IPFS + 区块链 系列] 入门篇 - IPFS环境配置这篇文章. 目录 1. 如何在IPFS新增一个文件 1.1 新建file.txt文件 1.2 查看ipfs相关命令 1.3 将file.txt添加到ipfs节点 2. 通过ipfs创建目录存储文件 3. 如何在IPFS新增一个目录 3.1