JAVA代理模式之二动态代理JDK详解
来源:互联网 发布:微销通软件下载 编辑:程序博客网 时间:2024/05/21 15:42
上一篇说道代理模式的实现方式有2种,那么这次就看看动态代理怎么实现?
动态代理就是在程序运行中来生成代理类并完成代理对象的实例化。
动态代理实现的方式:
1、jdk实现
2、cglib实现
其中jdk的实现是java自身的实现,但是要求目标类(委托类)必须实现接口,因为jdk生成的代理类已经继承了java的代理类Proxy了,所以只能借助接口让代理类和委托类有关系。
抽象行为:就是接口
public interface IBlind { void blind();}
来看看委托类
public class Miss implements IBlind{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void blind() { // TODO Auto-generated method stub System.out.println(name+",相亲了"); }}
jdk代理的使用步骤:
1、创建类实现InvocationHandler接口
2、声明委托类对象并完成实例化
3、创建方法生成代理类对象
jdk的代理类的实现:
public class ProxyFactory implements InvocationHandler{ private Object target;//目标类 public ProxyFactory(Object obj){ target=obj; } /** * 就是我们需要对方法的增强的实现 * 参数说明: * 1、代理类的对象 * 2、当前要执行的方法 * 3、方法的实际参数 * 返回值 * 就是要执行的方法的返回值 * */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub long ms=System.currentTimeMillis();//记录开始时间 System.out.println(method.getName()+"--开始:"+ms); Object res= method.invoke(target, args);//执行真正需要执行的方法 return res; } //生成代理类对象 public Object createProxy() { //1、创建类加载器 ClassLoader loader=Thread.currentThread().getContextClassLoader(); //2、获取目标类实现的所有的接口 Class<?>[] interfaces=target.getClass().getInterfaces(); //3、生成代理类并创建代理的对象 /** * 参数说明: * 1、类的加载器,加载动态生成的类信息 * 2、代理类需要实现的接口 * 3、代理类中的方法的回调接口*/ return Proxy.newProxyInstance(loader, interfaces, this); }}
注意几个地方:
1、在invoke的方法内部在调用 method.invoke(target, args);第一个参数也就是方法所在类的对象,不能使用proxy,否则会陷入死递归。外界触发这个方法的时候就是通过代理对象调用该方法,你内部还是调用代理对象的该方法不就是没有出口的递归吗?
2、在外部接受代理对象时,不能使用委托类进行接受。
因为委托类和代理类之间没有直接联系,只是大家实现了相同的接口而已,无法进行对象造型。
阅读全文
0 0
- JAVA代理模式之二动态代理JDK详解
- java代理模式详解之jdk动态代理
- java动态代理模式Proxy之JDK动态代理机制
- Java的代理模式(二)jDK的动态代理
- JAVA设计模式之【代理模式】二(jdk动态代理)
- 《Java与模式》之 代理模式(jdk动态代理)
- 动态代理模式之JDk动态代理
- 代理模式二(JDK动态代理)
- Java动态代理之JDK动态代理
- java代理(二)--jdk动态代理
- 代理模式之JDK动态代理
- 代理模式之jdk动态代理
- 代理模式之jdk动态代理
- java代理模式、动态代理(JDK,CGLIB)
- java 代理模式 jdk动态代理
- java jdk动态代理详解
- java 静态代理,jdk动态代理,CGLIB动态代理详解
- Java代理之JDK动态代理
- Android信鸽推送全解
- PHP header 的几种用法
- 【react】父子组件之间通讯props
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
- 【笔记】Matconvnet在windows8下编译安装过程
- JAVA代理模式之二动态代理JDK详解
- spring集成redis和jms时注意
- 用户资源访问
- 写个自己看的博客_UGUI_DragDrop官网例子
- MySQL慢SQL优化-如何分析性能瓶颈
- 抽象类 接口 区别
- mac+phpstorm+xdebug 最精炼安装方法
- fio使用指南(最全的参数说明)
- 哈夫曼树