代理:为了增强方法在不添加代码的情况下

1.Proxy基于接口的动态代理

/**
* 模拟一个消费者
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
final Prodecer prodecer = new Prodecer();
/**
* 动态代理:
* 特点:字节码随用随创建,随用随加载
* 作用:不修改源码的基础上对方法增强
* 分类:
* 1.基于接口的动态代理
* 2.基于子类的动态代理
* 基于接口的动态代理
* 涉及的类:Proxy
* 提供者 :jdk官方
* 如何创建代理对象:
* 使用Proxy类中的newProxyInstance方法
* 创建代理类的要求
* 被代理的类最少实现一个接口,
* newProxyInsttance方法参数,
* 参数 :Classloader 累加载器:用于加载代理对象字节码的。和被代理对象使用相同的类加载器
* nterfaces 被代理对象实现的接口
* InvocationHandler 他是让我们如何写代理,我们一般写该接口的实现类。通常写匿名内部类
*
*/
IProdecer proxyProducer = (IProdecer) Proxy.newProxyInstance(prodecer.getClass().getClassLoader(),
prodecer.getClass().getInterfaces(), new InvocationHandler() { /**
* 作用:执行被代理对象的任何接口方法都会经过该方法
* proxy 代理对象的引用
* method 当前执行的方法
* args 当前方法执行所需的参数
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//提供增强的代码
Object returnValue=null;
//1.获取方法执行的参数
float money=(Float) args[0];
//判断当前方法是不是saleProdect
if ("saleProdect".equals(method.getName())) {
returnValue=method.invoke(prodecer, money*0.8f);
}
return returnValue;
}
});
proxyProducer.saleProdect(1000f); } }

2.基于类的动态代理

/**
* 模拟一个消费者
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
final Prodecer prodecer = new Prodecer();
/**
* 动态代理:
* 特点:字节码随用随创建,随用随加载
* 作用:不修改源码的基础上对方法增强
* 分类:
* 1.基于接口的动态代理
* 2.基于子类的动态代理
* 基于类的动态代理
* 涉及的类:Enhancer
* 提供者 :第三方cglib库
* 如何创建代理对象:
* 使用Enhance类中的create方法
* 创建代理类的要求
* 被代理的类不能是最终类
* create方法参数,
* 参数 : Class:字节码 用于指定被代理对象的字节码
* callback 他是让我们如何写代理,我们一般写该接口的子接口的实现类。通常写匿名内部类
* methodProxy:当前执行方法的代理对象
*/
Prodecer cglibProdecer=(Prodecer) Enhancer.create(prodecer.getClass(), new MethodInterceptor() { public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//提供增强的代码
Object returnValue=null;
//1.获取方法执行的参数
float money=(Float) args[0];
//判断当前方法是不是saleProdect
if ("saleProdect".equals(method.getName())) {
returnValue=method.invoke(prodecer, money*0.8f);
}
return returnValue;
}
});
cglibProdecer.saleProdect(1000f); } }

TZ_05_Spring_Proxy基于接口的动态代理和基于类的动态代理的更多相关文章

  1. Spring AOP 介绍与基于接口的实现

    热烈推荐:超多IT资源,尽在798资源网 声明:转载文章,为防止丢失所以做此备份. 本文来自公众号:程序之心 原文地址:https://mp.weixin.qq.com/s/vo94gVyTss0LY ...

  2. 代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  3. Java代理模式精讲之静态代理,动态代理,CGLib代理

    代理(Proxy)是一种设计模式,通俗的讲就是通过别人达到自己不可告人的目的(玩笑). 如图: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 这三个代理模式,就 ...

  4. 【译】12. Java反射——类的动态加载和重新加载

    原文地址:http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html 博主最近比较忙,争取每周翻译 ...

  5. 最简单的动态代理实例(spring基于接口代理的AOP原理)

    JDK的动态代理是基于接口的 package com.open.aop; public interface BusinessInterface {     public void processBus ...

  6. 阶段3 2.Spring_07.银行转账案例_8 基于接口的动态代理回顾

    创建 Producer 生产者的类 创建标准.这标准就是接口 创建消费者的类 以前的方式,客户直接找生产厂家 代理商出现以后,怎么去联系代理商 动态代理 第一个参数是ClassLoader 第二个参数 ...

  7. JDK动态代理为什么必须要基于接口?

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和 ...

  8. 动态代理到基于动态代理的AOP

    动态代理,是java支持的一种程序设计方法. 动态代理实现中有两个重要的接口和类,分别是InvocationHandler(interface),Proxy(class). 要实现动态代理,必须要定义 ...

  9. 【Java】代理模式,静态代理和动态代理(基于JDK或CGLib)

    当我们需要在一个方法之前或之后添加一段逻辑时,自然会想到使用代理类.代理类帮我们代理了实际类的调用,然后可以在实际调用之前和之后添加一些逻辑,从而不浸入实际类. 拓展:由于代理类能在实际类调用之前和之 ...

随机推荐

  1. 在Eclipse中修改Jsp页面的新增模板

    打开Eclipse的Preferences页面 路径: Window à Preferences 搜索"jsp",点击"Templates",选择要修改的Jsp ...

  2. cv2 & PIL(pillow)显示图像

    = OpenCV和PIL中显示图像方式不一样,且支持的格式也不同 = cv在显示图像时是自定义的显示窗口,而PIL中显示是调用操作系统中的默认打开程序 如: import cv2 im = cv2.i ...

  3. jquery 表单验证插件

    其他: <form action=""> First name: <input type="text" name="FirstNam ...

  4. form表单简易注册登陆

    注册页面: html <form action="updata.php" method="post" id="text_form"&g ...

  5. MYSQL获取同时关注了某两个(或者N个)用户的用户

    使用redis的set类型数据的话会比较容易,但是业务场景就是在mysql里面,因此也需要思考解决方法 表结构: CREATE TABLE `table_name` ( `id` ) unsigned ...

  6. 转:linux下的c/c++开发

    源地址:http://zhidao.baidu.com/question/131261452.html 我就是做LINUX下的C开发的. 准确的说,LINUX下C才是主要的开发语言,但是写应用程序还是 ...

  7. 解决编译GCC内存不足的错误

    近期在使用阿里和腾讯的云服务器,由于只是测试用所以只租用了廉价512的内存,在编译gcc时遇到错误,表面上看只是编译错误,并且原因不明,纠结了几次之后猜测应该是由于系统资源不足导致的,所以尝试增加系统 ...

  8. CentOS 编译golang

    CentOS 安装Mercurial http://hi.baidu.com/lang2858/item/cda8f6026cd522e0f45ba67f 获取代码 $ hg clone -u rel ...

  9. centos部署jeecms

    首先下载安装包apache-tomcat-8.5.40.tar.gz jdk-8u211-linux-x641.rpm jeecmsv9.war 已经在WEB-INF/config/jdbc.prop ...

  10. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...