老王讲自制RPC框架.(二.动态代理)
(#简介)
什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常
广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来看看如何实现一个动态代理模式
(#实现)
首先我们来定义一个接口
public interface ICar {
void run(String name);
}
然后我们来定义一个实现类
public class Car implements ICar {
public void run(String name) {
System.out.println(name+"car is running");
}
}
接下来我们来实现一个通用的动态的代理工具类
public class ObjectProxy{
public <T> T create(final T t) {
return (T) Proxy.newProxyInstance(ObjectProxy.class.getClassLoader(),
t.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//before invoke
return method.invoke(t, args);
//after invoke
}
});
}
}
在这个工具类中我们使用到了泛型来使方法变得更通用,如果对于泛型缺乏理解的话请看这个博客:https://segmentfault.com/a/1190000002646193
最后我们来看一下调用:
public static void main(String[]args){
ICar car = new Car();
ObjectProxy carProxy = new ObjectProxy();
ICar proxyCar = carProxy.create(car);
proxyCar.run("benchi ");
}
如果不出意外的话运行main方法会出现: benchi car is running. 当然使用动态代理的最厉害的点就是你可以在调用这个方法的时候可以做一些before和after的事情
这样可操作性就很大,对于一些功能特别适用
(#)拓展
在反射方面介绍一个比较强大的库cglib,在某些特定的场景下使用fast反射是必须的,jdk的普通代理有一点是比较搓的,就是只能代理实现的接口,而不能代理自身的方法
这个时候想要实现动态代理的功能就需要使用到cglib了,好,下面举个栗子:
首先扩展原有实现类:增加一个自身的方法nRun,下面我们来实现它的代理
public class Car implements ICar {
public void run(String name) {
System.out.println(name+"car is running");
}
public void nRun(String name){
System.out.println(name+" 我是自身的run");
}
}
第一种实现:
public class FastProxy {
public <T> T create(final T t) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(t.getClass());
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return methodProxy.invoke(t,objects);
}
});
return (T) enhancer.create();
}
}
第二种实现:
public class FastProxy {
public <T> T create(final T t) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(t.getClass());
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
FastClass fastClass = FastClass.create(t.getClass());
FastMethod fastMethod = fastClass.getMethod(method.getName(),method.getParameterTypes());
return fastMethod.invoke(t,objects);
}
});
return (T) enhancer.create();
}
}
在main方法的调用上是没什么区别的,这样我们就实现了对于自身方法的动态代理.
老王讲自制RPC框架.(二.动态代理)的更多相关文章
- 老王讲自制RPC框架.(一.前言与技术选型)
(#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...
- 老王讲自制RPC框架.(四.序列化与反序列化)
#(序列化) 在实际的框架中,真正影响效率的就是数据的传输方式,以及传输的准备,或者说是tcp与http,序列化.当然要想提高整个框架的效率,需要采用一种高效的序列化 框架比如流行的protostuf ...
- 老王讲自制RPC框架.(三.ZOOKEEPER)
(#)定义Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配 ...
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- mybatis框架之动态代理
坦白讲,动态代理在日常工作中真没怎么用过,也少见别人用过,网上见过不少示例,但总觉与装饰模式差别不大,都是对功能的增强,什么前置后置,其实也就那么回事,至于面试中经常被问的mybatis框架mappe ...
- 二十二 动态代理&解决网站的字符集编码问题
设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car Interface Icar{ start r ...
- JAVA框架 Mybaits 动态代理
一.动态代理: mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类.底层通过反射实例化代理对象,通过代理对象调用相应的方法, ...
- Spring AOP系列(二) — 动态代理引言
接上一篇Spring AOP系列(一)- 代理模式,本篇来聊聊动态代理. 动态代理与静态代理的区别 要想了解动态代理与静态代理的区别,需要有两个前置知识点:java程序是如何执行的以及类加载机制. j ...
- 优云老王的心路历程(二):下一站Web体验监控产品
在上一篇文章中,和大家聊到了建立Web应用体验监控体系,经过了概念阶段,也完成了技术选型,就进入了把实质性的产品研发阶段.作为产品经理,时刻不敢忘记我们的产品目标:无限感知你的用户,建立完备的体验监控 ...
随机推荐
- 变量的解构赋值////////////z
变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...
- 第二天 ado.net, asp.net ,三层笔记
1. ado.net步骤: 一:倒入命名空间 using System.Data; using System.Data.sqlclient; 二:第一个模型 int ...
- debian的版本演进
debian有三个发行版本,stable版.testing版和unstable版. 其中,unstable版本是开发者正在开发的版本,它里面保存着debian的开发者当前的工作.这个版本是不断在被更新 ...
- Material Design Lite,简洁惊艳的前端工具箱 之 容器组件。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .网站上有对应每一 ...
- SQL语句 还原未知逻辑名称数据库
1. 查看 SQL Server 2000 中 Northwind 数据库文件的逻辑文件名(logical file name)和物理文件路径(operation system file name): ...
- ajax 如何接受 PHP页面返回的json数组
JSON JSON(JavaScript Object Notation)是Douglas Crockford提出的.他是一个轻量级的数据交换格式,基于JavaScript对象字面量. 我们可以将之前 ...
- linux 时间管理——概念、注意点(一)【转】
转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html ...
- unity3d 第三人称视角的人物移动以及相机控制
何谓第三人称?就像这样: 用wasd控制人物移动,同时保持在相机的中心.用鼠标右键与滚轮控制相机的角度和距离. 先说一下人物的移动: 首先给作为主角的单位加上 Charactor Controller ...
- vue transition
Vue.js 教程 (9) : 过渡动画 Vue.js 提供非常简单的过渡动画接口.这些过渡动画在 Vue.js 将目标元素插入或移除出 DOM 的时候会自动执行.能够触发动画的指令包括 v-if , ...
- Is the Information Reliable? -POJ2983差分约束
Time Limit: 3000MS Memory Limit: 131072K Description The galaxy war between the Empire Draco and the ...