CGLIB动态代理代码实例
2015-11-13 14:58
465 查看
java动态代理(cglib)
博客分类: java
java提供的基于Proxy、InvocationHandler的动态代理由于只能创建接口的代理对象,在实际应用中不能很好的满足需要,针对这个问题,另外一个开源框架cglib提供了一种实现方式,可以针对类进行代理对象的创建。
cglib官方网站:http://sourceforge.net/projects/cglib/files/
另外cglib依赖于asm(http://asm.ow2.org/)。
cglib使用示例:
HelloWorld.java
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/20/456ce8ba5cadcb0b5702e0790a905640.png)
public class HelloWorld{
public String sayHello(String name){
System.out.println("执行sayHello()");
return "hello,"+name;
}
}
拦截器MyMethodInterceptor.java
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/20/456ce8ba5cadcb0b5702e0790a905640.png)
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyMethodInterceptor implements MethodInterceptor{
/*
* obj 代理对象实例
* method 源对象的方法名
* args 传递给方法的实际入参
* proxyMethod 与源对象中的method相对应的代理对象中的方法
*/
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("执行方法"+method+"前");
//执行源对象的method方法
Object returnValue = proxy.invokeSuper(obj, args);
System.out.println("执行方法"+method+"后");
return returnValue;
}
}
代理工厂ProxyFactory.java
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/20/456ce8ba5cadcb0b5702e0790a905640.png)
import net.sf.cglib.proxy.Enhancer;
public class ProxyFactory {
/*
* 获得代理对象
*/
public static Object getProxyObj(String clazz) throws Exception{
Class<?> superClass = Class.forName(clazz);
Enhancer hancer = new Enhancer();
//设置代理对象的父类
hancer.setSuperclass(superClass);
//设置回调对象,即调用代理对象里面的方法时,实际上执行的是回调对象(里的intercept方法)。
hancer.setCallback(new MyMethodInterceptor());
//创建代理对象
return hancer.create();
}
}
测试类:
Java代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/20/456ce8ba5cadcb0b5702e0790a905640.png)
public class Test {
public static void main(String[] args) {
try {
HelloWorld hello = (HelloWorld) ProxyFactory.getProxyObj(HelloWorld.class.getName());
System.out.println(hello.sayHello("huangqiqing"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)前
执行sayHello()
执行方法public java.lang.String HelloWorld.sayHello(java.lang.String)后
hello,huangqiqing
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable前
执行方法protected void java.lang.Object.finalize() throws java.lang.Throwable后
相关文章推荐
- 《用Python玩转数据》学习笔记第2周(Part2)
- Java生成CSV文件实例详解
- Dubbo与Zookeeper、SpringMVC整合
- Java集合---ArrayList的实现原理
- (PHP)正则表达式-preg_match和preg_match_all()的用法
- ajax请求或者页面需要缓存,代码如下
- Java的各种内部类及其使用
- Hibernate与Spring 实现多租户 (Hibernate Multi Tenancy With Spring)
- OpenCV中的Image Watch,VS2013像matlab一样方便查看图像Mat像素值等
- asp页面快速找到菜单按钮转向的页面的方法
- php正则表达式学习笔记
- Spring 注解@value参数值的两种形式
- PHP请求页面
- java方法 将123转换成 “一百二十三”
- Java简介(1)
- C#基础概念 代码样例
- ACM JAVA+C常用方法模板
- python 99乘法口诀表
- maya中使用python改变选中物体线框颜色
- java jxl处理Excel学习地址