Spring_88 动态代理

一、基于接口的动态代理

1、代理类

特点: 字节码随用随创建,随用随加载
作用: 不修改源码的基础上对方法增强
分类:

  • 基于接口的动态代理
  • 基于子类的动态代理
package com.itheima.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * 模拟一个消费者
 */
public class Cilent {
	/**
	 *
	 * 	1、基于接口的动态代理:
	 * 		设计的类:Proxy
	 * 		提供者:	JDK官方
	 * 	如何创建代理对象:
	 * 		使用Proxy类中的newProxyInstance方法
	 * 	创建代理对象的要求:
	 * 		被代理类最少实现一个接口,如果没有则不能使用
	 * 	newProxyInstance方法的参数:
	 * 		ClassLoader loader:类加载器
	 * 			用于加载代理对象字节码的。和被代理对象使用相同的类加载器。
	 * 			固定写法:代理对象.getClass().getClassLoader()
	 *      Class<?>[] interfaces:字节码数组
	 *      	用于让代理对象和被代理对象有相同方法。
	 *      	固定写法:代理对象.getClass().getInterfaces()
	 *      InvocationHandler:用于提供增强的代码方法
	 *      	含义让我们写如何代理。一般都写一个该接口的实现类通常情况下都是匿名内部类(不必须)。
	 *      	此接口的实现类都是谁用谁写。
	 * @param args
	 */
	public static void main(String[] args) {
		final Producer producer = new Producer();
		
		
		IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(
			producer.getClass().getClassLoader(),//类加载器
			producer.getClass().getInterfaces(),//用于让代理对象和被代理对象有相同方法。
			new InvocationHandler() {//用于提供增强的代码方法
				
			/**
			 * 作用:执行代理对象的任何接口方法都会经过该方法。
			 * 方法的参数的含义
			 * @Param Object proxy		代理对象的引用(一般不用)
			 * @Param Method method		当前执行的方法
			 * @Param Object[] args		当前执行方法所需的参数
			 * @Return 					和被代理对象方法有相同的返回值
			 * @Throws Throwable
			 */
			public Object invoke(Object proxy, Method method, Object[] args) 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;
			}
		});
		proxyProducer.saleProduct(100200f);
			
	}
}

2、接口

package com.itheima.proxy;
/**
 * 对生产厂家要求的接口
 * @author 宋强
 *
 */
public interface IProducer {
	/**
	 * 销售
	 * @param money
	 */
	public void saleProduct(float money) ;
	/**
	 * 售后
	 * @param money
	 */
	public void afterService(float money) ;
}

3、接口实现类

package com.itheima.proxy;
/**
 * 	一个生产者
 */
public class Producer implements IProducer{
	/**
	 * 销售
	 * @param money
	 */
	public void saleProduct(float money) {
		System.out.println("销售产品,并拿到钱:"+money);
	}
	/**
	 * 售后
	 * @param money
	 */
	public void afterService(float money) {
		System.out.println("售后服务,并拿到钱:"+money);
	}
}

二、基于子类的动态代理

1、代理类

package com.itheima.cglib;
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 Cilent {
	/**
	 * 动态代理:
	 * 		特点:字节码随用随创建,随用随加载
	 * 		作用:不修改源码的基础上对方法增强
	 * 		分类:
	 * 			基于接口的动态代理
	 * 			基于子类的动态代理
	 * 	2、基于子类的动态代理:
	 * 		设计的类:Enhancer
	 * 		提供者:	第三方cglib库
	 * 	如何创建代理对象:
	 * 		使用Enhancer类中的create方法
	 * 	创建代理对象的要求:
	 * 		被代理类不能是最终类
	 *  
	 * 	create方法的参数:
	 * 		Class type:字节码
	 * 			用于指定被代理对象的字节码
	 * 			固定写法:对象.getClass()
	 *      Callback callback:用于提供增强的代码
	 *      	我们一般写的都是该接口的子接口实现类:MethodInterceptor
	 *      
	 * @param args
	 */
	public static void main(String[] args) {
		final Producer producer = new Producer();
		Producer cjlibProducer =(Producer) Enhancer.create(producer.getClass(), new MethodInterceptor() {
			/**
			 * @Param Object obj 代理对象的引用(一般不使用)
			 * @Param Method method 当前执行的方法
			 * @Param Object[] args 当前执行方法所需的参数
			 * 		以上三个参数和基于接口的动态代理中invoke方法的参数是一样的
			 * @Param MethodProxy proxy 当前执行方法的代理对象
			 * @Return 	
			 */
			public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) 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;
			}
		});
		cjlibProducer.saleProduct(10055500f);
	}
}

2、子类

package com.itheima.cglib;

/**
 * 	一个生产者
 */
public class Producer{
	/**
	 * 销售
	 * @param money
	 */
	public void saleProduct(float money) {
		System.out.println("销售产品,并拿到钱:"+money);
	}
	/**
	 * 售后
	 * @param money
	 */
	public void afterService(float money) {
		System.out.println("售后服务,并拿到钱:"+money);
	}
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值