Java 反射之动态代理模式
2018-02-23 17:14
513 查看
Java中动态代理模式主要是通过InvocationHandler类和Proxy类来实现,创建一个代理对象,去实现代理的功能,从而动态代理功能。
大致思路:
创建代理者:通过Proxy类中
代理者与被代理者的交互:当代理者需要调用一个行为时候,通知到InvocationHandler类,InvocationHandler对象会调用被代理者的对应的行为,从而实现代理者与被代理者的交互操作。
实战案例
生活中很常见的一个消费行为,消费者,代购人员,国外厂商三者可以构建一个代理场景。
1. 代购人员和国外厂商共性,拿出海外产品
先定义一个接口,定义一个产生产品的行为,花钱消费,得到商品。
2. 国外厂商,生产海外产品
一个接口的实现类,实际干活的家伙,也就是被代理的对象。
3. 代购人员和国外厂商的联系点:
一个Handler类用于创建代理对象,调用代理对象的方法时候,Handler类将调用被代理的对象的方法。
4. Client客户,也就是消费者 , 下单操作。
5. 最后,消费者看到海外产品到手中
控制台输出结果是:
本案例的项目代码: https://github.com/13767004362/JavaDemo/tree/master/ClassDemo
大致思路:
创建代理者:通过Proxy类中
newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)反射创建一个代理者。
代理者与被代理者的交互:当代理者需要调用一个行为时候,通知到InvocationHandler类,InvocationHandler对象会调用被代理者的对应的行为,从而实现代理者与被代理者的交互操作。
实战案例
生活中很常见的一个消费行为,消费者,代购人员,国外厂商三者可以构建一个代理场景。
1. 代购人员和国外厂商共性,拿出海外产品
先定义一个接口,定义一个产生产品的行为,花钱消费,得到商品。
package com.xingen.classdemo.proxy; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen */ public interface Product { /** * 花钱购买商品 * @param money * @return */ public String buy(double money); }
2. 国外厂商,生产海外产品
一个接口的实现类,实际干活的家伙,也就是被代理的对象。
package com.xingen.classdemo.proxy; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen * * 真实的被代理者,案例演示:海外购 */ public class ForeignProduct implements Product{ @Override public String buy(double money) { StringBuffer stringBuffer=new StringBuffer(); stringBuffer.append("花费"); stringBuffer.append(money); stringBuffer.append("美元代购国外产品"); return stringBuffer.toString(); } public static ForeignProduct newInstance(){ return new ForeignProduct(); } }
3. 代购人员和国外厂商的联系点:
一个Handler类用于创建代理对象,调用代理对象的方法时候,Handler类将调用被代理的对象的方法。
package com.xingen.classdemo.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by ${新根} on 2018/2/16 0016. * 博客:http://blog.csdn.net/hexingen */ public class ProductHandler implements InvocationHandler { /** * 被代理者,即真实操作者。 */ private Object object; /** * * @param object 传入被代理者 * @return 返回代理者 */ public Object bind(Object object){ this.object=object; //类加载器 ClassLoader classLoader=object.getClass().getClassLoader(); //获取实现的接口 Class<?>[] interfaces= object.getClass().getInterfaces(); //创建代理者 Object proxyObject= Proxy.newProxyInstance(classLoader,interfaces,this); return proxyObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //通过反射中Method类,读写被代理者中的方法,返回结果 Object returnMessage=method.invoke(this.object,args); return returnMessage; } public static ProductHandler newInstance(){ return new ProductHandler(); } }
4. Client客户,也就是消费者 , 下单操作。
public class Client { public static void main(String[] args) { useProxy(); } /** * 反射动态代理 */ public static void useProxy() { ProductHandler handler = ProductHandler.newInstance(); //创建代理者,类似海外代购员 Product product = (Product) handler.bind(ForeignProduct.newInstance()); //进行代购操作,返回需要的商品结果 String result = product.buy(2.5); System.out.println("反射动态代理:\n" + result); } }
5. 最后,消费者看到海外产品到手中
控制台输出结果是:
反射动态代理: 花费2.5美元代购国外产品
本案例的项目代码: https://github.com/13767004362/JavaDemo/tree/master/ClassDemo
相关文章推荐
- JAVA学习--反射之动态代理模式
- Java基础 - 类的加载,类加载器,反射,动态代理,模板设计模式,JDK5新特性,枚举(类),JDK1.7新特性
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- 从java 反射看延迟加载(代理模式)(六)——动态代理与静态代理
- Java基础之反射及动态代理,反射实现工厂模式
- Java的反射,动态代理,模版设计模式,
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- java笔记1(策略、代理模式、枚举、反射、注解)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Java设计模式Proxy之动态代理
- 【设计模式】学习笔记17:代理模式之保护代理与Java反射
- 【Java核心技术】类型信息(Class对象 反射 动态代理)
- java 动态代理模式
- java动态代理机制和反射机制间的联系
- 类代理java设计模式---动态代理(简单笔记)
- Java程序员从笨鸟到菜鸟之(三十九)大话设计模式(七)代理模式和java动态代理机制
- java____设计模式之动态代理模式
- JAVA的代理模式(静态代理、JDK动态代理、cglib动态代理)
- java反射机制(三)---java的反射和代理实现IOC模式 模拟spring