Java动态代理代码快速上手
动态代理的两个核心的点是:代理的行为 和 代理机构。
举个例子,上大学的时候,很多同学吃午饭的时候都是叫别人带饭,有一个人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动态代理代码快速上手的更多相关文章
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- 如何实现在已有代码之后添加逻辑之java动态代理
在上篇博客中讨论到java的静态代理, 就是通过组合的方法,前提是委托类需要实现一个接口,代理类也实现这个这个 接口,从何组合两个类,让代理类给委托类添加功能! 知道java的静态代理,我们又遇到一个 ...
- java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...
- Java动态代理全面分析
代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1 主题:规定代理类和真实对象共同对外暴露的接口: 2 代理类:专门代理真实对象的类: 3 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
- Java动态代理 深度详解
代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...
随机推荐
- [翻译] VBPieChart
VBPieChart https://github.com/sakrist/VBPieChart Pie Chart iOS control with different animations to ...
- background-size之CSS Sprite巧用
前言 background-size:规定背景图片的尺寸.为CSS3属性.so...万恶的ie浏览器,此刻的内心一定是崩溃的!说实话,作为一个前端的coder,面对CSS3如此多的炫酷效果,我不能用起 ...
- Python中readline()函数 去除换行符
从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: f = open ...
- 鸡肋提权之变态root利用
你急有毛用,我电脑没带,怎么搞? 联系了基友adminlm牛看看吧,他说有防护软件啥的,有root,无法UDF,于是我让他去Mof,经历一番周折,知道了,对mof目录也锁定了权限,无法用root导出m ...
- HTML5旋转立方体
http://42.121.104.41/templets/default/test1.htm 须要源代码的留言邮箱哈~
- Odoo中如何复制有唯一性约束的记录?
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281393.html 如果为模型的字段添加了唯一性约束,那么在记录的form视图功能菜单上选择“复制”时就会 ...
- 【PHP】 mysqli_autocommit() 函数
//获取每一篇文章的内容 function getPost($f_parent_id, $f_title, $f_username, $f_board_id,$f_post_time, $f_ip,$ ...
- js中this应用
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...
- Gradle初步
一.介绍 Gradle是一个基于 JVM 的富有突破性构建工具. 它为您提供了: 一个像 ant 一样,通用的灵活的构建工具 一种可切换的,像 maven 一样的基于约定优于配置的构建框架 强大的多工 ...
- RSA加密算法和签名算法
RSA加密算法 RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法). .密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个 ...