Java特性-动态代理
代理在开发中无处不在:
我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name)。我现在想把每次调用某个实现类的getXX方法时传的参数name记录在数据库某个表里,可问题是,,我们总不能在每个实现类里面去添加一个这样的处理模块吧?工作量太大了,把该处理逻辑写到一个static的工具类里面,然后每个实现类再去调用也挺麻烦。况且这个处理是给改接口专门使用的,放在工具类里也不合适啊。。
好办,我再写一个实现接口A的类B,此类的作用:
- 对外提供一个getXXX(String name)方法,此方法就是前面提到的那些实现类中的具体方法;
- 每当别的类调用它的getXXX(String name)方法时,都做一个处理,即记录name到数据库里;
代码如下(静态代理)
接口:
public interface A{
public Object getObj(String name);
}
实现类:
public class AaImpl implements A
{
public Object getObj(String name)
{
return "function from Aa"
}
} public class AbImpl implements A
{
public Object getObj(String name)
{
return "function from Ab"
}
}
代理类:
public class delegator implements A{ ABFactory ab = new ABFactory();
A a = ab.get(n); public Object getObj(String name){
//此处记录name到数据库
...
//此处开始执行get方法
return a.getObject(name);
}
}
上面的ABFactory负责生产A的实现类,通过get(n)中的参数,获得相应的对象;
采用以上方式,在少量实现类时很简单,也更容易理解;可是随着应用功能增加,实现原先接口的类越来越多,总不能每次都去修改工厂类吧。。
所有,动态代理产生了。。除了上面两点作用外,动态代理为我们提供一个最简化开发的模式
例如,我们在某个需求驱动下又创建了一个实现类Ac,它也继承A,它的getObj方法自然也要记录参数到数据库。
我们只管把类写出来就好了,之后被调用交给动态代理,它会帮我们处理好,别的代码都不需要动了。开发效率高,系统风险也低,开心。
接下来就是如何实现动态代理了:
委托类(代理)代码:
public class ProxyHandler implements InvocationHandler {
private Object impObj; // 绑定委托对象,并返回代理类
public Object bind(Object impObj) {
this.impObj = impObj;
/* 绑定该类实现的所有接口,取得代理类
这个类就是实现A接口的某个类,在调用它的方法时
就会先执行invoke中TODO-1部分的代码
然后执行TODO-2,也就是getObj方法了
其实之后也可以进行其他处理,处理代码在TODO-3中实现
*/
return Proxy.newProxyInstance(impObj.getClass().getClassLoader(), impObj.getClass().getInterfaces(), this);
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
// TODO-1
// TODO-2
result = method.invoke(impObj, args);
// TODO-3
return result;
}
}
当我们调用前面的类Ac时,只要如下:
ProxyHandler proxy = new ProxyHandler();
A c = (A) proxy.bind(new Ac);
c.getObj("XXX");
=============================================
此贴为本人原帖,帮助理解Java的动态代理特性,如有疏漏欢迎斧正,谢谢!
Java特性-动态代理的更多相关文章
- 深入理解Java反射+动态代理
答: 反射机制的定义: 是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为j ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java中动态代理实现机制
前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...
- java --- 设计模式 --- 动态代理
Java设计模式——动态代理 java提供了动态代理的对象,本文主要探究它的实现, 动态代理是AOP(面向切面编程, Aspect Oriented Programming)的基础实现方式, 动态代理 ...
- java的动态代理机制
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- java中动态代理
一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...
- Java的动态代理机制详解(转)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- (转)java的动态代理机制详解
原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一 ...
- [转载] java的动态代理机制详解
转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...
随机推荐
- 易货Beta版本发布说明
说明 由于前几天确实比较忙,所以没来得及写发布说明. 功能 我们在beta版本主要加入了以下几个功能: 一:增加了用户的发布界面 二:增加了用户的购买界面 三:使用下拉刷新取代了之前的handler后 ...
- contiki-rtimer
struct rtimer { rtimer_clock_t time; rtimer_callback_t func; void *ptr; }; typedef unsigned short rt ...
- swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念
***************可为空的类型 var demo2 :we_demo = nil 上面这个代码串的语法是错的 为什么呢, 在Swift中,所有的类型定义出来的属性的默认值都不可以是nil ...
- 2015项目timeline
1. app签到 http://h5.a.rongyi.com/html/app/sign/index.html (pc无效果.app端 20160105) 2.圣诞活动--砍价 http://h5 ...
- [HTML/CSS] ul元素居中处理
CSS: <style type="text/css"> #nav_sub_page { text-align: center; width: 80%; } #nav_ ...
- 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节
在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...
- Java中如何克隆集合——ArrayList和HashSet深拷贝
编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...
- Zadig - USB driver installation made easy
http://zadig.akeo.ie/
- NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)
摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...
- go语言环境搭建
1.官网https://golang.org/dl/下载go语言的执行器 2.此处以Windows操作系统上安装go为例,安装go1.7.3.windows-amd64.msi 3.配置go环境变量, ...