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("你和他分手吧!");


}

}

 

 

 

你可能感兴趣的:(cglib动态代理_讲解)