java动态代理的实现

来源:互联网 发布:淘宝卖家开店的流程图 编辑:程序博客网 时间:2024/06/05 04:57
先来无事,由于有打算读spring框架,那么还是来打一些基础吧,java的反射机制总得了解一些吧,这里就来看一个实现动态代理的例子:
package proxy1;public interface OutPut {public String outPut(String aa);}


这里是定义了一个接口,也就定义了一个方,outPut方法,接下来我们来看它的实现:

package proxy1;public class OutPutImpl implements OutPut{@Overridepublic String outPut(String aa) {// TODO Auto-generated method stubreturn aa;}}

实现也很简单,无非就是将输入的内容返回就是了,那么接下来就来看一个神奇的的东西,它叫做invoke的handler,听名字就能够猜出来,就是用于将执行方法的调用的:

package proxy1;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class InvokeHandler implements InvocationHandler{private Object proxy;public InvokeHandler(Object proxy) {  //传入需要进行代理的对象this.proxy = proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubSystem.out.println("调用的方法名字是: " + method);return method.invoke(this.proxy,args);  //这里直接调用了invoke方法}}

这里面就用到了java的反射的一些东西,无非就是在proxy对象上面调用相应的方法,那么这个handler应该怎么使用呢,我们继续来看代码:

package proxy1;import java.lang.reflect.Proxy;public class BeanFactory {public static Object getBean(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Object object = Class.forName(className).newInstance();InvokeHandler handler = new InvokeHandler(object);return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler); //对对象进行一层包装}public static void main(String args[]) throws InstantiationException, IllegalAccessException, ClassNotFoundException {OutPut temp = (OutPut) getBean("proxy1.OutPutImpl");System.out.println(temp.outPut("aaaa"));}}

这里的程序输出结果是:

      调用的方法名字是: public abstract java.lang.String proxy1.OutPut.outPut(java.lang.String)
      aaaa


那么上面的例子就算是完了,如果直接看结果的话就会很神奇,仿佛是我们在对象的方法中插入了我们的代码,可以在方法的调用过程中执行我们加入的一些代码,

其实不然,根据上面我们基本上我们可以猜出来java的reflect类库中做了什么事情:

用Proxy.newProxyInstance方法来包装一个对象,传进了该对象的classLoader和interfaces,以及我们自己定义的handler,那么就应该是这样的:

(1)在包装的过程中根据传进来的interfaces生成新的对象来实现这些接口,这样的话返回的对象看起来就跟要包装的对象差不太多了。

(2)在生成的新的对象的对应的方法的调用过程中其实最终会调用invokeHandler来访问这些方法,那么这样子看起来我们是在我们原来的对象的方法中加入了我们自己的代码,其实不然


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 城市居民无钱入社保医保怎么办 老婆说离婚又找不到怎么办 爱一个人太累了怎么办 车凹陷漏底漆了怎么办 燕子窝掉下来了怎么办 文科没考上一本怎么办 学校午休小学孩子吵闹怎么办 老鼠死在空调里怎么办 公务员老公四十岁想辞职怎么办 打胎5次又怀孕怎么办 墙纸颜色太淡了怎么办 皮子腺囊肿有点疼痛怎么办 地板颜色选浅了怎么办 地板买的太暗了怎么办 木地板贴好后发现颜色不好看怎么办 鞋上鞋扣老是开怎么办 虚拟机的win10蓝屏重启怎么办 fs免拆模板专利怎么办 新买的床咯吱响怎么办 实木床一动就响怎么办 cad图纸是斜的怎么办 老房子土墙腻子老掉怎么办 生完孩子子宫大怎么办 刚开的店没人怎么办 刚开业的店没人怎么办 美容店没人进店怎么办 新店开业招不到营业员怎么办 无意开通了花呗怎么办? 花呗灰色用不了怎么办 花呗逾期用不了怎么办 店铺花呗关闭了怎么办 花呗无法使用了怎么办 借呗自动关闭了怎么办 蚂蚁花呗无法开通怎么办 花呗本月还不了怎么办 蚂蚁借呗没钱还怎么办 淘宝账号被限制登录怎么办 辱骂买家被投诉骚扰怎么办 淘宝卖家骚扰买家怎么办 被淘宝卖家电话骚扰怎么办 闲鱼卖东西买家退货运费怎么办