1
2
3
4
5
6
7
8
9
|
package
com.mzsx.gclib;
public
class
FunctionServerImp {
public
void
creatdDoc(
int
count) {
System.out.println(
"创建了"
+count+
"对象。。。。。。。"
);
}
public
void
removeDoc(
int
count) {
System.out.println(
"***了"
+count+
"对象。。。。。。。"
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.mzsx.gclib;
public
class
Porformant {
private
long
start;
private
long
end;
public
void
start(){
System.out.println(
"执行start。。。。。"
);
start =System.currentTimeMillis();
}
public
void
end(){
end=System.currentTimeMillis();
System.out.println(
"耗时"
+(end-start)+
"ms........"
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package
com.mzsx.gclib;
import
java.lang.reflect.Method;
import
net.sf.cglib.proxy.Enhancer;
import
net.sf.cglib.proxy.MethodInterceptor;
import
net.sf.cglib.proxy.MethodProxy;
public
class
CGlibProxy
implements
MethodInterceptor {
private
Enhancer enhancer=
new
Enhancer();
public
Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(
this
);
return
enhancer.create();
}
@Override
public
Object intercept(Object obj, Method method, Object[] arg,
MethodProxy proxy)
throws
Throwable {
Porformant porformant=
new
Porformant();
porformant.start();
Object object=proxy.invokeSuper(obj, arg);
porformant.end();
return
object;
}
}
|
1
2
3
4
5
6
7
8
9
10
|
package
com.mzsx.gclib;
public
class
CGlibTest {
public
static
void
main(String[] args) {
CGlibProxy cGlibProxy=
new
CGlibProxy();
FunctionServerImp functionServerImp=(FunctionServerImp)cGlibProxy.getProxy(FunctionServerImp.
class
);
functionServerImp.creatdDoc(
10
);
functionServerImp.removeDoc(
20
);
}
}
|
对比JDK的AOP与CGlib的AOP:
1、JDK的AOP的proxy需要依赖与接口,而CGLib的APO不需要依赖接口;
2、JDK的AOP生成实例速度快,但是执行效率慢,CGLib刚好相反,是生成实例慢,执行效率快;
3、CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
动态代理的本质:
用来实现对目标对象进行增强,最终表现为类,只不过是动态创建子类,不用手工生成子类。
动态代理的限制:
只能在父类方法被调用之前或之后进行增强(功能的修改),不能在中间进行修改,要想在方法调用中增强,需要ASM(一个Java 字节码操作和分析框架)
本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/1367219