博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态代理
阅读量:6627 次
发布时间:2019-06-25

本文共 2043 字,大约阅读时间需要 6 分钟。

Java动态代理

什么是动态代理?

1、A接口有C方法,类B实现A接口,原本应该是执行B类中的C方法,可现在不这样做。

2、现在声明产生B类的代理类‘B’,由它来冒充B类的“兄弟”并“实现”A接口。

3、对外界来说‘B’应该也有C方法,可当真正的调用它时,它会执行与它关联InvocationHandler的invoke()方法,在这个方法里面你可以做很多事情。

 

 

动态代理:

代理模式是常用的java设计模式,它的特征是:

》代理类与委托类有同样的接口

》代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及时候处理消息等

》代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联。

》代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

 

JDK动态代理中包含一个类和一个接口:InvocationHandler接口:public interface InvactionHandler{              public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;  }参数说明:Object proxy:指被代理的对象Method method:要调用的方法Object[] args:方法调用时所需要的参数

  

Proxy类:Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供如下操作的方法:public static Object newProxyInstance(ClassLoader loader,Class
[] interfaces,InvocationHandler h) throws IllegalArgumentException参数说明:ClassLoader loader:类加载器Class
[] interfaces:得到全部的接口InvocationHandler h:得到InvocationHandler接口的子类实例

  

实例:

public interface Dinner {    public void haveDinner();}//被代理类public class MyDinner implements  Dinner{    @Override    public void haveDinner() {        System.out.println("妈妈做饭真好吃");    }}//代理类public class MyDinnerProxy implements InvocationHandler {    private Object obj;    //绑定被代理类对象,返回代理类对象    public Object bind(Object obj){        this.obj = obj;        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);    }    private void before(){        System.out.println("吃饭前洗手");    }    private void after(){        System.out.println("吃饭后刷碗");    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        after();        Object retrunVal = method.invoke(obj,args);        before();        return retrunVal;    }}//测试类    public static void main(String[] args){        Dinner hd = new MyDinner();//可以调用被代理类重写的方法        MyDinnerProxy mdp = new MyDinnerProxy();创建一个这个类的对象        //返回一个代理类对象,向上转型,调用重写的方法,也就是invoke()方法        hd = (Dinner) mdp.bind(hd);        hd.haveDinner();    }

  

 

转载于:https://www.cnblogs.com/yangHS/p/10735445.html

你可能感兴趣的文章
python之路day12--装饰器的进阶
查看>>
[LeetCode] Two Sum III - Data Structure Design
查看>>
课后作业-阅读任务-阅读笔记-4
查看>>
【转】ARC下dealloc过程及.cxx_destruct的探究
查看>>
NGUI的窗体的推动和调节大小(drag object和drag resize object)
查看>>
关于WordPress中字体加载慢的问题解决方案(转)
查看>>
PhotoShop常用快捷键
查看>>
关于 MySQL LEFT JOIN 你可能需要了解的三点
查看>>
mysql filesort 的解决方案
查看>>
GDAL源码剖析(十一)之OGR投影说明
查看>>
第七章例题、心得及问题。
查看>>
windows7系统下一些常用工具的总结
查看>>
Python垃圾回收机制(转)
查看>>
02-CSS基础与进阶-day9_2018-09-12-21-37-34
查看>>
OBJECT_ID 技巧整理
查看>>
【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
查看>>
对链表的操作(数据结构线性表算法设计练习)
查看>>
关于 this 和 prototype 的理解
查看>>
面试总结——Java高级工程师(三)
查看>>
java开始到熟悉62
查看>>