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(),来实现 在原方法调用的前后 添加操作




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值