静态代理:

例子:

接口:

public interface InterfaceBase {
void proxy();
}

接口实现类:

public class InterfaceBaseReal implements InterfaceBase{
public void proxy() {
System.out.println("InterfaceBase......");
}
}

代理类:

public class InterfaceBaseRealProxy  implements InterfaceBase{
//调用之前的功能
private InterfaceBaseReal interfaceBaseReal;
//通过构造函数进行被代理类的初始化
public InterfaceBaseRealProxy(InterfaceBaseReal interfaceBaseReal) {
this.interfaceBaseReal = interfaceBaseReal;
} public void proxy() {
System.out.println("InterfaceBaseRealProxy....before");
//调用被代理类的功能,保留原来的不变
interfaceBaseReal.proxy();
System.out.println("InterfaceBaseRealProxy....after");
}
}

动态代理:

动态代理的实现步骤:
必须有的类:被代理的类
被代理的类所实现的接口
实现InvocationHandler接口的类
流程:实现IncationHandler接口,
接口要求:通过构造函数传入被代理的类
在重写invoke函数里面进行被代理类方法的调用
编写增强逻辑
通过Proxy类的静态方法获得代理类:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class<?>[] { Foo.class },handler);
获取类加载器,哪个类的都可以, 一般是使用当前类
被代理类所对应接口的Class对象数组,可以多个
实现InvocationHandler的类实例

第二个接口实现类:

public class InterfaceBaseReal2 implements InterfaceBase{
public void proxy() {
System.out.println("InterfaceBase22222......");
}
}

处理调用程序:

//实现InvacationHandler接口的类,这个类被成为调用处理程序
public class BaseInvocationHandler implements InvocationHandler {
//invocationHandler实现类里面必须传入被代理的类(实现被代理接口的类)
//这里使用对象的顶层基类,主要可以传入不同的对象
private Object object;
//通过构造函数传入
public BaseInvocationHandler(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("InterfaceBaseRealProxy....before");
//调用被代理类的功能,保留原来的不变
Object re =method.invoke(object,args);
System.out.println("InterfaceBaseRealProxy....after");
//返回真是代理对象,也可以通过 return proxy
return re;
}
}

获取代理实例:

public class HandlerTest {
public static void main(String[] args) {
//被代理类所实现的接口的Class对象
Class[]inter = {InterfaceBase.class};
//被代理的类的实例
InterfaceBase interfaceBase = new InterfaceBaseReal();
//实现接口InvocationHandler的类的实例(必须传入被代理的类)
BaseInvocationHandler bh = new BaseInvocationHandler(interfaceBase);
//通过Proxy的静态函数得到代理实例
InterfaceBase ibproxy = (InterfaceBase) Proxy.newProxyInstance(InterfaceBase.class.getClassLoader(),inter,bh);
ibproxy.proxy(); System.out.println(ibproxy.getClass());
System.out.println("2222222222222222222222222222222222");
//第二个被代理的类
InterfaceBase interfaceBase2 = new InterfaceBaseReal2();
BaseInvocationHandler bh2 = new BaseInvocationHandler(interfaceBase2);
InterfaceBase ibproxy2 = (InterfaceBase)Proxy.newProxyInstance(HandlerTest.class.getClassLoader(),inter,bh2);
ibproxy2.proxy();
}
}

注意:因为我们的处理调用程序当中设置传入的对象为Object,所以可以传入不同的对象

java-中的代理的更多相关文章

  1. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  2. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

  3. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  4. java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...

  5. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  6. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  7. java中静态代理跟动态代理之间的区别

    文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...

  8. java中动态代理

    一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...

  9. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  10. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

随机推荐

  1. 深度测评,商业智能BI、报表工具谁更好用?

    在很多人入门数据分析师或者投身大数据行业的时候,必然会听到的两个词就是"报表工具"和"BI商业智能"."BI"一词已被更广泛地知晓,但提起B ...

  2. 【C#】AssemblyLoadContext 加载程序集

    使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载 一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.N ...

  3. Spring MVC视图解析器(ViewResolver)

    视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象.Spring MVC 提供了很多视图解析类,其中每一项都对应 Java Web 应 ...

  4. 《破碎的残阳,我们逆光》连载小说- HashMap剖析

    破碎的残阳,我们逆光[连载小说]- HashMap剖析 "行到水穷处,坐看云起时"        前言: 偶尔翻阅了自己当时高中时代写的日志,发现了几篇自己多年未打开的自写小说草本 ...

  5. Python之ini配置文件详解

    INI介绍 INI是英文"初始化"(initialization)的缩写,被用来对操作系统或特定程序初始化或进行参数设置.由节(section). 键(key).值(value)构 ...

  6. 『现学现忘』Docker相关概念 — 1、云计算概念

    目录 1.云计算的概念 2.示例说明云计算 3.小故事说明云计算 "云计算"这个词,相信大家都非常熟悉. 作为信息科技发展的主流趋势,它频繁地出现在我们的眼前.伴随它一起出现的,还 ...

  7. C#控制打印机打印

    一.引用BarcodeStandard.dll #region BarcodeStandard.dll /* * * 使用说明 需要通过NuGet进行安装BarcodeLib.dll,必不可少 */ ...

  8. VirtualBox虚拟机--安装新系统

    问题概述:在VirtualBox虚拟机中使用ISO镜像文件安装新系统. 继在本机系统上学习Python把系统搞坏掉以后,总结教训试新东西还是先在虚拟机上练手. 找同事拷了一个win10系统的ISO镜像 ...

  9. Web端网站兼容性测试如何进行?来看看浏览器的兼容性测试要点

    软件兼容性测试工作的目标是保证软件按照用户期望的方式进行交互.随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求,测试软件之间能否协作变得越来越重要. 平台的兼容性,包 ...

  10. 【C#操作Excel】同名Excel放入同一文件夹中,然后合并为同一个Excel文件

    近期有对Excel操作的需求,由于都是重复劳动,故分享代码如下,本人也是技术菜鸟没有考虑性能,如果有大牛能够指教就再好不过了 事先电脑中需要安装Excel,然后Vs中引用Microsoft.Offic ...