动态代理的两个核心的点是:代理的行为 和 代理机构。

举个例子,上大学的时候,很多同学吃午饭的时候都是叫别人带饭,有一个人H特别热心肠,想了一个办法,他在门口挂了个公示牌,每天有谁想要找人带饭就写公告牌上写下自己想吃的饭,H每次直接记下谁谁谁想吃什么饭然后去帮大家买饭。这就是一个典型代理的过程。这里代理的行为就是带饭,代理的机构就是H。而且代理行为和代理机构之间进行了解耦。

下面,我们基于这个例子使用JDK提供的代理机制来实现代码。

首先,我们创建一个代理行为类接口BuyLunchInt(因为可能会有很多人需要带饭,并且带不同的饭,用于继承实现)

package proxy;
/**
* @Author darrenqiao
*/
public interface BuyLunchInt {
void buyLunch();
}

接着,我们基于代理行为的接口实现代理机构(代理机构的实现是核心)

  • 主要用到两个reflection包中的两个类,Invocationhandler 和 Proxy类。
  • Proxy类通过传入的类信息创建代理实例
  • InvocationHandler则通过实现invoke方法实现代理实例方法的执行
package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* @Author darrenqiao
* 基于代理的行为接口实现的代理机构类
* 主要工作两部分:
* 通过Proxy创建代理实例
* 通过重写InvocationHandler类的invoke方法实现代理行为的执行
*/
public class ProxyAgent implements InvocationHandler {
private Object target; public Object create(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} //实现代理机制,通过反射基于接口调用方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("看看谁要我帮忙带饭");
method.invoke(target, args);
System.out.println("呐,你的饭");
return null;
}
}

然后,就是有哪些人需要带饭,带什么饭,就实现接口BuyLunchInt并写到公告牌configure.properties中

package proxy;
/**
* @Author darrenqiao
*/ public class DarrenBuyLunch implements BuyLunchInt {
@Override
public void buyLunch() {
System.out.println("darren要吃炒饭");
}
}
class=proxy.DarrenBuyLunch

最后,在main方法中,几个步骤,先看看公告牌configure.properties上有么有需要代理的对象,有则创建代理机构并代理执行;没有则退出。

import proxy.BuyLunchInt;
import proxy.ProxyAgent; import java.io.*;
import java.util.Properties; /**
* @Author darrenqiao
*/
public class Main { static Properties prop = new Properties(); static void init(){
try {
//这里初始化需要代理的类
InputStream inputStream = new BufferedInputStream(new FileInputStream("C:\\zongpengq\\code\\testDynamicProxy\\src\\configure.properties"));
prop.load(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
init();
if (prop.size() == 0){
System.out.println("今天没人要带饭");
return;
}
//创建代理机构
ProxyAgent proxyAgent = new ProxyAgent();
for (String s : prop.stringPropertyNames()) {
String className = prop.getProperty(s);
Class classInfo = Class.forName(className);
//创建具体的代理的对象
BuyLunchInt buyLunch = (BuyLunchInt)classInfo.newInstance();
//代理机构为代理对象创建代理实例(类似:给你安排个人代理你去做这件事)
BuyLunchInt proxy = (BuyLunchInt)proxyAgent.create(buyLunch);
//代理去做事
proxy.buyLunch();
} }
}

我们看看运行的结果,如果没有人需要带饭(即把公告牌configure.properties清空),运行结果如下

如果有人需要带饭,比如Darren,在configure.properties中进行了配置,运行结果如下

Java动态代理代码快速上手的更多相关文章

  1. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  2. 如何实现在已有代码之后添加逻辑之java动态代理

    在上篇博客中讨论到java的静态代理, 就是通过组合的方法,前提是委托类需要实现一个接口,代理类也实现这个这个 接口,从何组合两个类,让代理类给委托类添加功能! 知道java的静态代理,我们又遇到一个 ...

  3. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  4. 一文读懂Java动态代理

    作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...

  5. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  6. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  7. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  8. 深入浅出Java动态代理

    文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...

  9. Java动态代理 深度详解

    代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...

随机推荐

  1. rabbitmq集群步骤

    这里选用三台主机,主机名分别是hidden1, hidden2, hidden3 主机名一定要修改成不一样的,要不然加入集群的时候会加入不成功 修改完主机名后,在/etc/hosts文件中加入对应的解 ...

  2. Python学习---网络编程 1217【all】

    OSI七层模型: 物理层, 数据链路层, 网络层,传输层,会话层,表达层,应用层 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等 传输层:TCP,UDP 网络层:I ...

  3. C# 冒泡排序法、插入排序法、选择排序法

    冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序. 以从小到大排序为例. 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, ...

  4. ASP.NET Core 使用 SQLite 教程,EF SQLite教程,修改模型更新数据库,适合初学者看懂详细、简单教程

    SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文 https://blog.csdn.net/qq_31930499/article/details/80420246 文 ...

  5. find bugs设置

  6. mongodb的安装和启动

    1.在mongodb的官网上下载安装包 https://www.mongodb.com/download-center 选择对应你的系统的安装包下载 如果下载不了 可以使用这个链接下载http://d ...

  7. Jackson实现Object对象与Json字符串的互转

    在项目开发过程中,当客户端与服务器响应时,数据交互是必不可少的.然而通过Json实现数据交互成为我们开发中的一部分,进而Jackson为我们的Json转化提供了很好的机制.下面我将利用实例总结如何使用 ...

  8. WebKit由三个模块组成-Webkit模块介绍

    2.       Webkit 源代码由三大模块组成: 1). WebCore, 2). WebKit, 3). JavaScriptCore. WebCore:排版引擎核心,WebCore包含主要以 ...

  9. cocos2d-x中关于打包成APK的问题

    转载自:http://blog.csdn.net/u013315178/article/details/51254630 之前在网上看了很多的帖子大多数用ide 来打包 太麻烦了 而且一般没有人现场指 ...

  10. 五子棋AI算法

    原理框图总结 参考链接 http://blog.csdn.net/xiaoyu714543065/article/details/8746876 http://blog.csdn.net/pi9nc/ ...