您的位置:首页 > 编程语言 > Java开发

Java动态代理之cglib

2017-07-02 14:34 246 查看
cglib是对jdk动态代理的补充,弥补了因没有接口的类生成代理类的缺失。

下面通过简单的例子学习一下cglib的使用,当然,要是用需要第三方的jar包,jar包自行下载。

业务类

public class BankService {
public void save(){
System.out.println("存钱...");
}
}


业务增强类

public class ServiceEnhancer {
public static void before(){
System.out.println("检查钱是否完整无存");
}

public static void after(){
System.out.println("如果有错,就回滚");
}
}


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[] args, //方法的动态入参
MethodProxy proxy //代理类实例
) throws Throwable {
ServiceEnhancer.before();
Object result = proxy.invokeSuper(obj, args);
ServiceEnhancer.after();
return result;
}

}


public class CglibDemo {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();

BankService bankservice = (BankService) proxy.getProxy(BankService.class);

bankservice.save();

//com.proxy.cglib.BankService$$EnhancerByCGLIB$$82923c9a@2e5d6d97
//System.out.println(bankservice);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java cglib 动态代理