首页 > 代码库 > Cglib动态代理详解

Cglib动态代理详解

查阅了很多资料,这样理解起来好像可以一起呵成,不知道有没有什么地方不对,有的话希望大家指导一下

Cglib动态代理 

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

示例 :

Jar 包 : cglib-2.2.jar, asm-all-3.1

Helloworld 方法

package com.greysh.cglib;


public class HelloWorld {

       public void say() {

              System.out.println("Hello World");

       }

} 

回调类(我把它叫做拦截类)因为它实现了MethodIntercept接口,该接口我翻译一下就是 “ 方法拦截 "

package com.greysh.cglib;


import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {

       @Override

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

                     MethodProxy methodProxy) throws Throwable {

              System.out.println("Before Helloworld~");

        methodProxy.invokeSuper(object, args);

              System.out.println("After Helloworld~");

              return null;

       }

} 

测试类

package com.greysh.cglib;


import net.sf.cglib.proxy.Enhancer;

public class TestCglib {

       public static void main(String[] args) {

           Enhancer enhancer = new Enhancer();//创建加强类(其实就是代理类的雏形),这是我根据单词意思理解的

            
             //代理类需要继承委托类,(使用的是继承实现代理)
           enhancer.setSuperclass(HelloWorld.class);

            //加强类设置回调对象来拦截代理对象方法调用,拦截到后,用这个回调对象的intercept方法增强原方法调用,(也就是添加一些操作)
           enhancer.setCallback(new CglibProxy());

           HelloWorld helloWorld = (HelloWorld) enhancer.create();//创建代理对象(这里的helloWorld才叫做代理对象)

           helloWorld.say();

       }

} 






过程是这样的:先创建一个拦截类实现methodIntercept接口,再创建一个加强类(代理类雏形)enhancer,,调用setSuperclass()来继承委托类,使用setCollback(this),设置回调对象,其实设置这个对象的目的就是用来拦截的,

设置了前面两个属性后,加强类enhancer调用create()方法,就完成了化蝶,成为代理对象,代理对象在调用say()时,被回调对象拦截,进而调用回调对象的intercept(),来实现 在原方法调用的前后 添加操作




Cglib动态代理详解