Java CGLIB
Java Cglib
1.CGLIB包的介绍
代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,当它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包
CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如 Groovy和BeanShell,也是使用ASM来生成java的字节码。当不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
Figure 1: CGLIB Library and ASM Bytecode Framework
图一显示了和CGLIB包和一些框架和语言的关系图。需要注意的是一些框架例如Spring AOP和Hibernate,它们为了满足需要经常同时使用JDK的动态代理和CGLIB包。Hiberater使用JDK的动态代理实现一个专门为 WebShere应用服务器的事务管理适配器;Spring AOP,如果不强制使用CGLIB包,默认情况是使用JDK的动态代理来代理接口。
2.CGLIB 代理的APIS
CGLIB包的基本代码很少,当学起来有一定的困难,主要是缺少文档,这也是开源软件的一个不足之处。目前CGLIB的版本是(2.1.2),主要由一下部分组成:
net.sf.cglib.core
底层字节码处理类,他们大部分与ASM有关系。
? net.sf.cglib.transform
编译期或运行期类和类文件的转换
? net.sf.cglib.proxy
实现创建代理和方法拦截器的类
? net.sf.cglib.reflect
实现快速反射和C#风格代理的类
? net.sf.cglib.util
集合排序工具类
? net.sf.cglib.beans
JavaBean相关的工具类
· 大多时候,仅仅为了动态地创建代理,你仅需要使用到代理包中很少的一些API。
正如我们先前所讨论的,CGLIB包是在ASM
相关文档:
jdk
的集合框架的主体结构:
接口
简述
实现
操作特性
成员要求
Set
成员不能重复
HashSet
外部无序地遍历成员。
成员可为任意Object子类的对象,但如
果覆盖了equals方法,同时注意修改hashCode方法。
TreeSet
外部有序地遍历成员;附加实现了
SortedSet, 支持子集等要求顺序的操作
成员要求实现caparable ......
public class Test1 {
public static void main(String[] args) {
//assignment
byte bval1 = 1, bval2 = 2;
short sval1 = 1, sval2 = 2;
int ival1 = 1, ival2 = 2;
long lval1 = 1, lval2 = 2;
float fval1 = 1.0f, fval2 = 2.0f;
double dval1 = 1.0, dval2 = 2.0;
char cval1 = 'a' ......
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("网址");
BufferedReader in = new BufferedReader(new InputStreamReader(yahoo.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) ......
2.通常,把与循环index不相关的移到循环的外面
view plaincopy to clipboardprint?
for(int i=0;terminal=x.length;i<terminal;i++){
X[i]=x[i]/scaleA*scaleB;
}
for(int i=0;terminal=x.length;i<terminal;i++){
X[i]=x[i]/scaleA*scaleB;
}
改为
view plaincopy to clipboardprint?
double ......
命名规范
项目名:各单词首字母大写,其它字母小写
包名:全部字母小写且唯一,通常为公司域名的倒序
源文件名:各单词首字母大写,其它字母小写
方法名:第一个单词全部小写,其余单词首字母大写,其它字母小写,一般应为动词
成员变量名:第一个单词全部小写,其余单词首字母大写,其它字母小写
成员常量名:所有单 ......