Cglib的简单使用

上一篇博客我们介绍回到了如何在我们的代码中实现静态代理模式,和动态代理模式,以及这两种模式的好处与坏处!

JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类可以使用CGLIB包。

CGLIB是一个强大的高性能的代码生成包。它被许多AOP的框架(例如Spring AOP)使用,为他们提供方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

         下边我们就来看一下我们改如何使用cglib

         首先我们下载cglib文件 总共这四个,我们添加到我们的项目中!然后建立我们需要的类! 一个我们的操作类UserManager

        

 

package com.tgb.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;

import org.objectweb.asm.commons.Method;

public class UserManager {
	
	public void  method(){  
        System.out.println("建立自己的知识体系还是很重要的,尽管觉得麻烦");  
    }  
    public void function(){  
        System.out.println("如果我只停留在使用的别人开发的工具阶段,那么再过5年我也对不起程序员这个称呼");  
    }  
}

 

 

    然后建立我们的代理类
package com.tgb.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 Enhancer enhancer = new Enhancer();  
    public Object getProxy(Class clazz){  
        //生成指定类对象的子类,也就是重写类中的业务函数,在重写中加入intercept()函数而已。   
        enhancer.setSuperclass(clazz);  
        //这里是回调函数,enhancer中肯定有个MethodInterceptor属性。   
        //回调函数是在setSuperclass中的那些重写的方法中调用---猜想   
        enhancer.setCallback(this);  
        //创建这个子类对象   
        return enhancer.create();  
    }  
    
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println(method.getName()+"执行之前做一些准备工作");  
        //一不小心写成下面被注释一行代码了。 StackOverflowError   
        Object result = proxy.invokeSuper(obj,args);  
        System.out.println(method.getName()+"执行之后做一些准备的工作");  
        return result;  
	}
}

    我们的操作类

 

package com.tgb.proxy;

import net.sf.cglib.proxy.Enhancer;

public class Person {

	public void  Test() {  
		CglibProxy proxy = new CglibProxy();
		  //通过生成子类的方式创建代理类
		UserManager um = (UserManager)proxy.getProxy(UserManager.class);
		um.function();
    }  
}

 

 

    当我们执行这个方法的时候,我们就会看到这样的输出

        

    是成功了呢!是的,成功了,那么应用cglib 就可以很容易的解决代理问题了!我们就可以很容易的写好一个aop 的实现了呢,可以很容易的做一个权限的判断!     但是据说当访问量特别大以后,cglib会严重的影响性能,但是没有测试过,所以我们还是谨慎使用!

        

你可能感兴趣的:(设计模式)