基于子类的动态代理

package com.itheima.cglib;

import com.itheima.proxy.IProducer;import com.itheima.proxy.Producer;import com.sun.webkit.dom.ProcessingInstructionImpl;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;

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

/** * @Author: lijiahao * @Description: 模拟一个消费者 * @Data: Create in 21:49 2020/2/7 * @Modified By: */public class Client {    public static void main(String[] args) {        final Producer producer = new Producer();

        /**         *动态代理         *  特点:字节码随用随创建,随用随加载         *  作用:不修改源码的基础上对方法增强         *  分类:         *      基于接口的动态代理         *      基于子类的动态代理         *  基于子类的动态代理:         *      涉及的类:Enhancer         *      提供者:第三方cglib         *  如何创建代理对象:         *      使用Enhancer类中的create方法         *  创建代理对象的要求:         *      被代理类不能是最终类         *  create方法的参数         *      class:字节码         *          用于指定被代理对象的字节码         *      Callback:用于提供增强的代码         *          我们如何写代理,一般情况下是写一个该接口的实现类通常情况下是匿名内部类,但不是必须的         *          此接口的实现类,谁用谁写         *          我们一般写的都是该接口的子接口实现类:MethodInterceptor         **/        Producer cglibProducer  = (Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {            /**             * @Author Lijiahao             * @Description              * @Date 22:31 2020/2/7             * @Param [proxy, method, args, methodProxy当前执行方法的代理对象]             * 前三个参数和基于接口的动态代理的invoke方法的参数一样             * @return java.lang.Object             **/

            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {                //提供增强的代码                Object returnValue = null;                //1.获取方法执行得参数                Float money = (Float) args[0];                //2.判断当前方法是不是销售                if("saleProduct".equals(method.getName())){                    returnValue =  method.invoke(producer,money*0.8f);                }                return returnValue;            }        });        cglibProducer.saleProduct(12000f);    }}

原文地址:https://www.cnblogs.com/lijiahaoAA/p/12274958.html

时间: 2024-11-12 08:29:01

基于子类的动态代理的相关文章

基于接口和基于子类的动态代理

一:基于接口(JDK1.3之后提供): import com.aiitec.service.IAccountService;import com.aiitec.utils.TransactionManager; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springfra

阶段3 2.Spring_07.银行转账案例_9 基于子类的动态代理

代理一个普通的java类 导入cglib的包 它还有一个asm的依赖.会自动加进来 创建cglib的文件夹.把proxy里面的Client和Producer复制到cglib文件夹 Producer不实现任何的接口 Client内的代码要重新写 不能受罪种类,如果是最终类就不能再创建子类了 参数1是Class 参数2是Callback MethodInterceptor是Callback的子接口 前面三个参数和基于接口的动态代码参数是一样的 producer需要用final来修饰 调用一下这个方法

基于JDK的动态代理技术详解

虽然对于Spring的基本思想Aop是基于动态代理和CGlib这一点很早就有所认识,但是什么是动态代理却不甚清楚.为了对Spring加深理解,我觉得好好学习一下java的动态代理是非常有必要的. 静态代理 在学习动态代理之前我先花一点时间了解一下静态代理,从静态代理出发了解代理到底是怎么一回事,以及了解静态代理的局限性,进而明白为什么要发展及使用动态代理技术. 相信使用过Spring框架的同学都知道Spring利用Aop完成声明式事务管理以及其他的代理增强,也就是在方法执行前后加上一些譬如时间.

基于接口的动态代理

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class

关于装饰模式和动态代理模式

装饰模式和动态代理模式乍一看差不多,都是动态的增加行为,其实有各自的区别. 一.首先我们看一下装饰设计模式,其基本思想如下: 1.编写一个类,实现与被装饰类相同的接口.目的使他们有相同的行为 2.定义一个实例变量,引用被装饰对象.目的和原来的老对象进行交接 3.定义构造方法,把被装饰对象注入进来. 4.对于不需要改写的方法,调用被装饰对象的. 5.对于要改写的方法,改写即可. 废话不多说,举一个例子,模拟实现一个数据库连接池,在这里,我想重写close方法,以实现调用close方法之后不是关闭连

动态代理看这个就一目了然

动态代理的总结 1.动态代理分类 我们设计一个应用的场景: 以前的导演剧组找演员的时候,直接到家里找这个演员谈价格就可以让他演戏,但是随着时代的发展,出现了经济公司,签约演员. 现在让演员演出就要直接找经济公司,不能找演员. 1.1基于接口的动态代理 // 创建一个演员的角色 public class Actor implements IActor { ? /** * 基本表演 * @param money */ @Override public void basicAct(Float mone

JDK的动态代理与cglib动态代理

JDK的动态代理与cglib动态代理 两种代理模式: 动态代理:代理类不存在,在程序运行过程中,动态生成代理类和代理类对象,再通过代理对象调用目标对象 静态代理(装饰者模式):代理类是提前创建好的,直接创建代理类对象,再通过代理对象调用目标对象 一.JDK动态代理 jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy类的newProxyInstance方法. Object proxy = Proxy.newProxyI

Cglib和jdk动态代理的区别

动态代理解决了方法之间的紧耦合, IOC解决了类与类之间的紧耦合! Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理 2. Cglib动态代理:利用ASM框架,对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理 什么时候用cglib什么时候用jdk动态代理? 1.目标对象生成了接口 默认用JDK动态代理 2.如果目标对象使

基于jdk和cglib的动态代理

动态代理是Spring Aop的基础,分为基于JDK的动态代理和基于CGLIB的动态代理. 声明一个被代理的类: package com.maheng.proxy.jdk; public interface IUser { public void save(String name); } package com.maheng.proxy.jdk; public class User implements IUser{ @Override public void save(String name)