`
mrzhangtufu
  • 浏览: 60501 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JDK and CGLib 动态代理的简单示例

阅读更多

JDK动态代理的简单使用示例:

如有业务类:
package com.proxy;


public class ForumServiceImpl implements ForumService{
    public void removeTopic(int topicId){

        System.out.println("模拟删除记录"+topicId);
        try{
            Thread.currentThread().sleep(20);
        }catch(Exception e){
            throw new RuntimeException(e);
        }

    }

    public void removeForum(int forumId){
        System.out.println("模拟删除记录"+forumId);
        try{
            Thread.currentThread().sleep(20);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }

}

1、创建一个实现java.lang.reflect.InvocationHandler 接口的代理类,如:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class PerformanceHandler implements InvocationHandler{
    private Object target; //要进行代理的业务类的实例
    public PerformanceHandler(Object target){
        this.target = target;
    }
//覆盖java.lang.reflect.InvocationHandler的方法invoke()进行织入(增强)的操作
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable{
        System.out.println("Object target proxy:"+target);
        System.out.println("模拟代理加强的方法...");
        Object obj = method.invoke(target, args); //调用目标业务类的方法
        System.out.println("模拟代理加强的方法执行完毕...");
        return obj;
    }
}

2、用java.lang.reflect.Proxy.newProxyInstance()方法创建动态实例来调用代理实例的方法:

import java.lang.reflect.Proxy;

public class TestForumService {
    public static void main(String args[]){
        ForumService target = new ForumServiceImpl();//要进行代理的目标业务类

        PerformanceHandler handler = new PerformanceHandler(target);//用代理类把目标业务类进行编织
 
//创建代理实例,它可以看作是要代理的目标业务类的加多了横切代码(方法)的一个子类
        ForumService proxy = (ForumService)Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), handler);

        proxy.removeForum(10);
        proxy.removeTopic(20);
    }
}


CGLib动态代理示例:

1、创建一个实现net.sf.cglib.proxy.MethodInterceptor接口的实例来为目标业务类加入进行代理时要进行的操作或增强:

import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
/**
 *CGlib采用非常底层的字节码技术,可以为一个类创建子类,
 并在子类中采用方法拦截技术拦截父类方法的调用,并顺势进行增强,即是织入横切逻辑
 * @author tufu
 */
public class CglibProxy implements MethodInterceptor{
    private Enhancer enhancer = new Enhancer();
    //覆盖MethodInterceptor接口的getProxy()方法,设置
    public Object getProxy(Class clazz){
        enhancer.setSuperclass(clazz); //设者要创建子类的类
        enhancer.setCallback(this); //设置回调的对象
        return enhancer.create(); //通过字节码技术动态创建子类实例,
    }

    public Object intercept(Object obj,Method method,Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("模拟代理增强方法");

        //通过代理类实例调用父类的方法,即是目标业务类方法的调用
        Object result = proxy.invokeSuper(obj, args);

        System.out.println("模拟代理增强方法结束");
        return result;
    }
}

2、通过java.lang.reflect.Proxy的getProxy()动态生成目标业务类的子类,即是代理类,再由此得到代理实例:

import com.proxy.ForumServiceImpl;
import java.lang.reflect.Proxy;

public class TestCglibProxy {
    public static void main(String args[]){
        CglibProxy proxy = new CglibProxy();

        //动态生成子类的方法创建代理类
        ForumServiceImpl fsi =
                (ForumServiceImpl)proxy.getProxy(ForumServiceImpl.class);

        fsi.removeForum(10);
        fsi.removeTopic(2);
    }
}

2
0
分享到:
评论
1 楼 mrzhangtufu 2008-10-24  
哈哈,之前那个主题背景不会这样,改了主题后没有留意,现在改回来~~

相关推荐

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我

    Java使用JDK与Cglib动态代理技术统一管理日志记录

    主要介绍了Java使用JDK与Cglib动态代理技术统一管理日志记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    Java设计模式及应用场景之《代理模式》

    文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤JDK动态代理示例JDK动态代理实现原理JDK动态代理局限性2、CGLIB动态代理CGLIB...

    Java代理示例代码

    示例说明代理模式、Java动态代理的JDK实现和cglib实现。

    Spring CGLlB动态代理实现过程解析

    主要介绍了Spring CGLlB动态代理实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    AOP编程示例

    CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java ...JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    spring-source-weaving-example:使用AspectJ的Spring Boot源代码编织示例

    对于JDK代理,只能拦截代理上的公共接口方法调用。 使用CGLIB,将拦截代理上的公共方法和受保护方法,甚至在必要时甚至对程序包可见的方法也将被拦截。 您可以在找到更多。 换句话说, 对私有方法的任何调用都...

    broccoli:模仿实现注解式springMVC

    支持Jdk原生代理和Cglib代理 支持多个代理的叠加效果 通过spi实现代理的扩展 目前实现了Before,After,Aroud 三种通知方式. 2.基于netty实现http连接,接受get,post方法 实现controller requestMapping注解方式 整体...

    spring chm文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring中文帮助文档

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring API

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”通知器 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring 2.0 开发参考手册

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理...

    hibernate + spring 简化包

     ◆samples:该文件夹下包含Spring的几个简单例子,可作为Spring入门学习的案例。  ◆src:该文件夹下包含Spring的全部源文件,如果开发过程中有地方无法把握,可以参考该源文件,了解底层实现。  ◆test:该文件夹...

    J2EE开发全程实录(JAVA项目开发)

    3.4 动态代理... 40 3.4.1 CGLib. 40 3.4.2 JDK Proxy. 42 第4章 Java平台下的Web开发.... 48 4.1 标记语言... 48 4.2 自定义标记库的开发... 48 4.2.1 Tag接口的生命周期... 49 4.2.2 hello标记的开发... 50 4.2.3 ...

Global site tag (gtag.js) - Google Analytics