Dynamic proxy 与cglib的简单实现
来源:互联网 发布:qq教程网站源码 编辑:程序博客网 时间:2024/05/01 21:11
动态代理分为:Dynamic proxy(针对实现了接口的类)和cglib(针对实现了无接口的类)。CGLib与Dynamic Proxy的代理机制基本类似,Dynamic Proxy返回的动态代理类,是目标类所实现的接口的另一个实现版本,它实现了对目标类的代理,而CGLib返回的动态代理类,则是目标代理类的一个子类。
下面实例对二者进行简单的实现。由于简单明了,同时代码中有详细的注释,故不一一详解。注意自己导入cglib包
接口代码:China .java
- package Test;
- /*
- * 接口
- */
- public interface China {
- public void sayOlympic();
- }
实现类:Chinese .java
- package Test;
- /*
- * 实现类
- */
- public class Chinese implements China {
- @Override
- public void sayOlympic() {
- System.out.println("北京欢迎你");
- }
- }
辅助工厂类:ChineseFactory .java(可要可不要,具体看实现)
- package Test;
- /*
- * 辅助工厂类
- */
- public class ChineseFactory {
- /*
- * 根据类名创建类的实例
- */
- public Object getInstance(String clz){
- Class obj=null;
- try {
- obj=Class.forName(clz);
- return (Object)obj.newInstance();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 根据传入的类名,返回Dynamic proxy AOP代理对象
- * @param clzName
- * @return
- */
- public Object getAopObjectProxy(String clz){
- //ChHandler hander=new ChHandler();
- ChHandler hander=(ChHandler)getInstance("Test.ChHandler");
- return hander.bind(getInstance(clz));
- }
- /**
- * 根据传入的类名,返回cglib AOP代理对象
- * @param clzName
- * @return
- */
- public Object getCglibObjectProxy(String clz){
- //ChCglib cglib=new ChCglib();
- ChCglib cglib=(ChCglib)getInstance("Test.ChCglib");
- return cglib.bind(getInstance(clz).getClass());
- }
- }
Dynamic proxy 实现类:ChHandler.java
- package Test;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- /*
- * Dynamic proxy动态代理,针对:接口,对应cglib的MethodInterceptor
- */
- public class ChHandler implements InvocationHandler {
- Object targetForeigner;
- /**
- * 返回动态代理实例
- * Proxy对应Cglib的Enhancer
- * @param chinese
- * @return
- */
- public Object bind(Object chinese){
- this.targetForeigner=chinese;
- return Proxy.newProxyInstance(chinese.getClass().getClassLoader(), chinese.getClass().getInterfaces(),this);
- }
- /**
- * 在Invoke方法中,Dynamic proxy的实现,该方法在被代理类调用方法时自动调用
- */
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- Object foreigner=null;
- System.out.println("奥运会开幕式开始。。。。");
- foreigner=method.invoke(targetForeigner, args);
- System.out.println("奥运会开幕式闭幕。。。。");
- return foreigner;
- }
- }
cglib proxy类:ChCglib.java
- package Test;
- import java.lang.reflect.Method;
- import net.sf.cglib.proxy.MethodInterceptor;
- import net.sf.cglib.proxy.MethodProxy;
- import net.sf.cglib.proxy.Enhancer;
- /*
- * 代理cglib,针对:类,对应Dynamic proxy的InvocationHandler
- */
- public class ChCglib implements MethodInterceptor {
- private Enhancer enhancer=new Enhancer();
- /**
- * 返回动态代理实例
- * Enhancer对应Dynmaic proxy的Proxy
- * @param chinese
- * @return
- */
- public Object bind(Class clz){
- enhancer.setSuperclass(clz);
- enhancer.setCallback(this);
- return enhancer.create();
- }
- /**
- * 在intercept方法中,cglib proxy的实现,该方法在被代理类调用方法时自动调用
- */
- @Override
- public Object intercept(Object o, Method method, Object[] methodParameters,
- MethodProxy methodProxy) throws Throwable {
- Object foreigner=null;
- System.out.println("奥运会开幕式开始。。。。");
- foreigner=methodProxy.invokeSuper(o, methodParameters);
- System.out.println("奥运会开幕式闭幕。。。。");
- return foreigner;
- }
- }
与Dynamic Proxy中的Proxy和InvocationHandler相对应,Enhancer和MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理。
测试类:ChineseApp.java(有多种实现,具体看代码)
- package Test;
- /*
- * 测试类
- */
- public class ChineseApp {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Object foreigner;
- //Dynamic proxy测试
- //原始做法
- China chinese=new Chinese();
- ChHandler handler=new ChHandler();
- foreigner=handler.bind(chinese);
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy basic");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //反射机制做法
- ChineseFactory factory=new ChineseFactory();
- handler=(ChHandler)factory.getInstance("Test.ChHandler");
- foreigner=handler.bind((China)(factory.getInstance("Test.Chinese")));
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy reflect");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //反射机制+工厂做法
- factory=new ChineseFactory();
- foreigner=factory.getAopObjectProxy("Test.Chinese");
- if(foreigner instanceof China){
- System.out.println("Dynamic proxy reflect factory");
- ((China)foreigner).sayOlympic();
- }else{
- System.out.println("中国反对将奥运政治化的外国人");
- }
- //cglib测试
- //反射机制做法
- ChCglib cglib=new ChCglib();
- Chinese chin=new Chinese();
- foreigner=cglib.bind(chin.getClass());
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy basic");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:中国反对将奥运政治化的外国人");
- }
- //反射机制+工厂做法
- factory=new ChineseFactory();
- cglib=(ChCglib)factory.getInstance("Test.ChCglib");
- foreigner=cglib.bind(factory.getInstance("Test.Chinese").getClass());
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy reflect");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:中国反对将奥运政治化的外国人");
- }
- //工厂做法之二
- foreigner=factory.getCglibObjectProxy("Test.Chinese");
- if(foreigner instanceof Chinese){
- System.out.println("cglib proxy factory");
- ((Chinese)foreigner).sayOlympic();
- }else{
- System.out.println("cglib说:北京反对将奥运政治化的外国人");
- }
- }
- }
呵呵,简单的实例。
- Dynamic proxy 与cglib的简单实现
- Dynamic proxy与 CGLib 的区分
- Dynamic Proxy模式的简单实现
- Cglib dynamic proxy
- CGLib proxy dynamic
- Proxy模式与Dynamic Proxy实现
- JDK Dynamic Proxy and cglib
- Cglib Dynamic Proxy(Cglib 动态代理)
- 动态代理proxy与CGLib的区别
- CGlib与Java Proxy的动态代理
- 动态代理proxy与CGLib的区别
- 动态代理proxy与CGLib的区别
- 动态代理proxy与CGLib的区别
- 动态代理proxy与CGLib的区别
- 动态代理proxy与CGLib的区别
- JavaJDK Proxy与CGLib的区别<转>
- 动态代理proxy与CGLib的区别
- 动态代理proxy与CGLib的区别
- C#中获取路径的多种方法
- 热烈祝贺第二十九届奥林匹克运动会开幕
- mysql-大数据量的导入
- 位域 排序 struct endian
- Presentation: what have I learned from MS Team?
- Dynamic proxy 与cglib的简单实现
- Berkeley DB (DB)介绍
- VC6.0中自己定义注释代码的快捷键
- 物质运动制约大自然的绝对自由
- 学会放弃我们才能了解美好
- 诺基亚5310XM基本属性
- 解读极限编程的十二大原则——前言
- 事典:刘濞的叛乱
- 开发前期