`

AOP的JDK and CGLib 动态代理 示例

阅读更多
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); 
    } 
}

 

分享到:
评论

相关推荐

    输出JDK和CGLib动态代理产生的class文件.zip

    本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助我们理解这两种技术的工作原理以及它们生成的class文件结构。 首先,我们来详细了解JDK动态代理。JDK动态代理基于Java的接口...

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

    CGLIB示例可能涉及使用Enhancer类来生成代理对象。对于拦截器,可能会展示如何定义和注册拦截器,以及如何构建拦截器链。此外,这些示例还可能包含运行所需的相关jar包,如CGLIB库。 总之,理解和掌握JDK动态代理、...

    JDK、CGLib动态代理

    在Java开发中,JDK和CGLib是两种常见的实现动态代理的技术,它们允许我们在运行时创建对象的代理,以增强或拦截对象的方法调用。动态代理在AOP(面向切面编程)中扮演着重要角色,使得我们可以方便地添加如日志、...

    java动态代理(JDK和cglib).pdf

    动态代理主要分为两种实现方式:JDK动态代理和CGLIB动态代理。 1. JDK动态代理: JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`...

    jdk动态代理 cglib3.0动态代理

    JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

    cglib动态代理介绍

    下面是一个简单的CGlib动态代理的示例: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

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

    我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在不需要接口的情况下创建代理对象。您将了解CGLib的工作原理,以及如何生成子类来实现...

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 1.3 代理模式的四个角色 2. 代理模式的类型 2.1 静态代理 2.2 JDK动态代理

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 1.3 代理模式的四个角色 2. 代理模式的类型 2.1 静态代理 2.2 JDK动态代理 ...9.4 CGLIB代理和JDK动态代理有什么区别? 10. 总结

    Java动态代理(JDK和cglib)

    ### Java动态代理(JDK和cglib) #### 一、代理模式概述 代理模式是一种结构型设计模式,其中代理类含有一个对真实主题对象的引用,这样代理对象就可以执行一些预备或清理工作,并将真正的调用传递给真实主题对象...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    JDK动态代理简单示例

    此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行拦截和增强。 总之,JDK动态代理为我们提供了一种灵活的代码扩展机制,使得在不修改原有代码的情况...

    java动态代理(JDK和cglib).docx

    下面是一个简单的JDK动态代理示例: ```java interface Service { void doSomething(); } class ServiceImpl implements Service { @Override public void doSomething() { System.out.println("Doing ...

    Java JDK代理、CGLIB、AspectJ代理分析比较

    与JDK动态代理和CGLIB相比,AspectJ的优势在于它不仅支持方法级别的增强,还可以支持字段级别的增强。 #### 六、总结 - **JDK动态代理**:优点在于无需目标类实现特定接口即可使用;缺点在于只能针对实现了接口的...

    cglib动态代理

    7. **应用场景**:CGLib常用于AOP框架中,例如在Spring AOP中,它作为JDK动态代理的补充,用于处理没有实现接口的类。此外,在单元测试中,CGLib可以用来模拟复杂对象,使测试更加灵活。 8. **性能对比**:相对于...

    AOP 动态代理demo

    在"AopDemo"这个文件中,我们可以期待看到一个完整的示例,它将演示如何使用JDK动态代理和CGLIB来创建代理对象,并添加增强功能。通过这个例子,开发者可以更好地理解AOP的工作原理,以及如何在实际项目中应用这两种...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    - Spring支持两种类型的代理:JDK动态代理(如果目标对象实现了接口)和CGLIB代理(如果目标对象没有接口,使用字节码生成技术)。 - 在Spring配置中,可以使用`@Aspect`注解定义切面,`@Before`、`@After`、`@...

Global site tag (gtag.js) - Google Analytics