受七周七语言、编程语言实现模式等读物启发,计划写一个语言之美系列博文,因为最近工作上用的比较多的语言是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