cglib动态代理_讲解

   JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,所以用final修饰的方法将不能实现代理。同样我们采用jdk动态案例分析说明

1、创建实体类

package www.csdn.spring.cglib.proxy;

//真实主题角色

public class SayGoodByeImpl {


public void say(String content) {

System.out.println("say:" + content);


}

}

2、测试说明:

package www.csdn.spring.cglib.proxy;


import org.junit.Test;


public class TestSay {


@Test

public void say(){


//真实主题角色

SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();


//自己和女朋友说

sayGoodByeImpl.say("咱们分手吧!");


}

}

 

3、采用cglib代理实现

package www.csdn.spring.cglib.proxy;


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 Object target;


// 创建代理对象

public Object createProxyInstance(Object target) {

this.target = target;

Enhancer enhancer = new Enhancer(); // 用于生成代理对象的

enhancer.setSuperclass(this.target.getClass());// 用于设置代理对象的父类

enhancer.setCallback(this); // 设置回调

return enhancer.create(); // 创建代理对象

};


/**

 * proxy:目标对象代理的实例 method:目标对象调用父类方法的method实例 args:调用父类方法传递参数

 * methodProxy:代理的方法去调用目标方法

 */

@Override

public Object intercept(Object proxy, Method method, Object[] args,

MethodProxy methodProxy) throws Throwable {


Object returnValue = null;


// 目标方法执行之前的操作

beforeMethod();

// 执行目标方法

returnValue = methodProxy.invoke(target, args);

// 目标方法执行之后的操作

afterMethod();


return returnValue;

}


public void beforeMethod() {

System.out.println("---------------------目标方法之前执行");

}


public void afterMethod() {

System.out.println("---------------------目标方法之后执行");

}


}

4、测试说明:

package www.csdn.spring.cglib.proxy;


import org.junit.Test;


public class TestSay {


@Test

public void say(){


//真实主题角色

SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();


//代理角色

CglibProxy cglibProxy = new CglibProxy();

//创建了一个 目标类的子类的对象  

SayGoodByeImpl proxy = (SayGoodByeImpl) cglibProxy.createProxyInstance(sayGoodByeImpl);


//代理说

proxy.say("你和他分手吧!");


}

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值