代理

你有a类, 本来是调用c类的方法, 完成某个功能。 但是c不让a调用。

a -----不能调用 c的方法。
在a 和 c 直接 创建一个 b 代理,c让b访问。
a --访问b---访问c

使用代理模式的作用
1.功能增强: 在你原有的功能上,增加了额外的功能。 新增加的功能,叫做功能增强。
2.控制访问: 代理类不让你访问目标,例如商家不让用户访问厂家。

实现代理的方式

1.静态代理
1) 代理类是自己手工实现的,自己创建一个java类,表示代理类。
2) 同时你所要代理的目标类是确定的。
特点: 1)实现简单 2)容易理解。
缺点:
当你的项目中,目标类和代理类很多时候,有以下的缺点:
1)当目标类增加了, 代理类可能也需要成倍的增加。 代理类数量过多。
2) 当你的接口中功能增加了, 或者修改了,会影响众多的实现类,厂家类,代理都需要修改。影响比较多。

 模拟一个用户购买u盘的行为。用户是客户端类商家:代理,代理某个品牌的u盘。厂家:目标类。三者的关系: 用户(客户端)---商家(代理)---厂家(目标)商家和厂家都是卖u盘的,他们完成的功能是一致的,都是卖u盘。一个功能对应一个方法,对应的是接口实现步骤:1. 创建一个接口,定义卖u盘的方法, 表示你的厂家和商家做的事情。2. 创建厂家类,实现1步骤的接口3. 创建商家,就是代理,也需要实现1步骤中的接口。4. 创建客户端类,调用商家的方法买一个u盘。代理类完成的功能: 1. 目标类中方法的调用2. 功能增强

2.动态代理

在静态代理中目标类很多时候,可以使用动态代理,避免静态代理的缺点。
动态代理中目标类即使很多, 1)代理类数量可以很少, 2)当你修改了接口中的方法时,不会影响代理类。

动态代理: 在程序执行过程中(程序跑起来),使用jdk的反射机制,创建代理类对象, 并动态的指定要代理目标类。
换句话说: 动态代理是一种创建java对象的能力,让你不用创建TaoBao类,就能创建代理类对象。

 在java中,要想创建对象:1.创建类文件, java文件编译为class2.使用构造方法,创建类的对象。

动态代理的实现

  1. jdk动态代理(理解): 使用java反射包中的类和接口实现动态代理的功能。jdk动态代理,必须有接口,目标类必须实现接口
    反射包 java.lang.reflect 包中的 InvocationHandler(接口) , Method(类), Proxy(类).
  2. cglib动态代理(了解): cglib是第三方的工具库, 创建代理对象。
    cglib的原理是继承, cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法, 实现功能的修改。cglib的要求目标类比较宽松, 只要能继承就可以了。

jdk动态代理的实现

反射包 java.lang.reflect , 里面有三个 : InvocationHandler , Method, Proxy.
1)InvocationHandler 接口(调用处理器):就一个方法invoke()
invoke():表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。

代理类完成的功能:1. 调用目标方法,执行目标方法的功能2. 功能增强,在目标方法调用时,增加功能。

InvocationHandler 接口:表示你的代理要干什么。
怎么用:
1.创建类实现接口InvocationHandler
2.重写invoke()方法, 把原来静态代理中代理类要完成的功能,写在这。

2)Method类:表示方法的, 确切的说就是目标类中的方法。
作用:通过Method可以执行某个目标类的方法,Method.invoke();
method.invoke(目标对象,方法的参数)
不需要知道方法的名字,因为这个method对象是jdk确定的

3)Proxy类:核心的对象,创建代理对象。之前创建对象都是 new 类的构造方法()
现在我们是使用Proxy类的方法,代替new的使用。
方法: 静态方法 newProxyInstance()
作用是: 创建代理对象, 等同于静态代理中的TaoBao taoBao = new TaoBao();

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)参数:1. ClassLoader loader 类加载器,负责向内存中加载对象的。 使用反射获取对象的ClassLoader类a , a.getCalss().getClassLoader(),  目标对象的类加载器2. Class<?>[] interfaces: 接口, 目标对象实现的接口,也是反射获取的。3. InvocationHandler h : 我们自己写的,代理类要完成的功能。 返回值:就是代理对象

实现动态代理的步骤

  1. 创建接口,定义目标类要完成的功能
  2. 创建目标类实现接口
  3. 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
  4. 使用Proxy类的静态方法,创建代理对象。 并把返回值转为接口类型。

1. 什么是动态代理 ?

使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。
动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。

jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理

2. 知道动态代理能做什么 ?

可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。

框架基础---动态代理相关推荐

  1. 深圳Java培训:Spring框架之动态代理

    深圳Java培训:Spring框架之动态代理 前言 动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理 ...

  2. java基础---动态代理机制

    动态代理的意思是,有一个委托类有一个代理类,让代理类去实现委托类的方法,这样既可以对委托类的代码实现进行封装和隐藏,还能够在委托类的基础上添加额外的一些自定义处理. 两种代理方式 1.jdk原生的代理 ...

  3. 四、MyBatis 框架 Dao 动态代理

    1.1 步骤 (1) 去掉 之前编写的Dao 接口实现类 (2) getMapper 获取代理对象 只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象.该方法 ...

  4. 03、动态代理--CGLib引入增强

    package com.offer.note.Java基础.动态代理.CGLib引入增强;public interface Browser {void visitInternet(); } packa ...

  5. Java动态代理简述

    Java动态代理简述 一.代理简介 代理一词含义十分宽泛,例如金融领域的股票发行代理.营销领域的销售代理.以及计算机领域中的代理设计模式等.尽管代理一词被使用的领域如此广泛,但是代理一词的大致的抽象含 ...

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

    前几天的时候,交流群里的小伙伴抛出了一个问题,为什么JDK的动态代理一定要基于接口实现呢? 好的安排,其实要想弄懂这个问题还是需要一些关于代理和反射的底层知识的,我们今天就盘一盘这个问题,走你~ 一个 ...

  7. 反射,类加载器,动态代理

    反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.即 将字节 码文件(class文件)封装成对象(Class对象),并将字节码文件(class文件所对应的类)中的内容(方法和属性)都封 ...

  8. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  9. 动态代理 ---- 框架基础技术

    JSK动态代理 内容导航 代理模式 proxy pattern proxy proxy pattern proxy role 静态代理 static proxy 静态代理的缺点 dynamic pro ...

  10. 了解动态代理:Spring AOP基础

    为什么选择AOP: 要了解AOP(面向方面​​的编程),我们需要了解软件开发中的"横切关注点". 在每个项目中,都有一定数量的代码在多个类,多个模块中重复执行,例如几乎所有类和所有 ...

最新文章

  1. 第5关:32位快速加法器设计
  2. 静态路由中使用一跳和出接口的区别
  3. codeblock生成64位dll_Pythonnet/clr : Unable to find assembly xxxx.dll
  4. (chap4 Http状态码) 3XX重定向
  5. Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名
  6. php-curl-class,一个简单PHP CURL类
  7. Cloudera Manager 术语和架构
  8. Hibernate5-1对多(1:n)-级联删除-cascade=delete-orphanl
  9. 工作流之流程定义存储表
  10. IS-IS基础网络配置实例
  11. PHP--变量部分知识点
  12. python爬取58同城房子发布的手机号码_python爬虫:爬取58同城武汉地区商品房信息(最后碰到了58同城的反爬机制,吓得我不敢说话···)...
  13. TwinCAT 3 安全门程序
  14. 图像处理 抗锯齿放大_什么是抗锯齿,它如何影响我的照片和图像?
  15. disabled与enabled是什么?disabled与enabled属性详解
  16. MacBook 电脑Touch Bar该怎么设置
  17. 揭开特斯拉的地图“疑云”
  18. Navicat Premium v12.0.23.0 破解教程x86,x64通用,手动破解
  19. html设置背景图片高度,如何使用CSS设置背景图像的大小?
  20. 【热门收藏】iOS开发人员必看的精品资料(100个) ...

热门文章

  1. 在Windows中使用FileZilla Server创建FTP
  2. MFC CImageList序列图的用法
  3. 基于单片机的交通信号灯控制系统设计
  4. 数据库中select 查询详解
  5. proteus8.0绘制元器件pcb封装
  6. 收藏:常见物联网通信技术概览
  7. 基于CWMP(TR069)协议ACS服务器的搭建
  8. 一起学 Unix 环境高级编程 (APUE) 之 信号
  9. 这些年看过的书...
  10. sqlsever2012评估期已过