java的动态代理设计模式
2015-10-13 21:41
597 查看
代码实现:
测试代码:
注:
抽象角色(抽象类或接口),真实角色(真正实现了业务逻辑接口),代理角色(自己并未实现业务逻辑接口,而是调用真实角色来实现),这里接口和接口的实现没有列举,只列举了动态代理生成
一个类要能处理动态代理必须实现InvocationHandler 接口
动态代理的获取需要Proxy的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来生成
invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用
package com.lky.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object obj;//被调用的目标对象 public DynamicProxy(Object obj) { this.obj = obj; } /** * @Title: invoke @param arg0 @param arg1 被调用目标对象的方法 @param arg2 被调用目标对象方法的参数 @return @throws Throwable 参数 * @return 返回类型 */ @Override public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { Object result = null; doBefore(); result = arg1.invoke(obj, arg2); doAfter(); return result; } //工厂模式生成动态动态代理 public static Object proxyFactory(Object object) { Class<? extends Object> cls = object.getClass(); return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(object)); } public void doBefore() { System.out.println("初始化。。。。。。。。。"); } public void doAfter() { System.out.println("日志处理。。。。。。。。。"); } }
测试代码:
package com.lky.proxy; import org.junit.Test; public class testProxy { @Test public void test(){ Cat cat=new Cat(); Animal animal=(Animal)DynamicProxy.proxyFactory(cat); animal.eat(); System.out.println("-------------------"); animal.sleep(); System.out.println("-------------------"); Car car=new Car(); Vehicle vehicle=(Vehicle)DynamicProxy.proxyFactory(car); vehicle.run(); System.out.println("-------------------"); vehicle.stop(); } }
注:
抽象角色(抽象类或接口),真实角色(真正实现了业务逻辑接口),代理角色(自己并未实现业务逻辑接口,而是调用真实角色来实现),这里接口和接口的实现没有列举,只列举了动态代理生成
一个类要能处理动态代理必须实现InvocationHandler 接口
动态代理的获取需要Proxy的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来生成
invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用
相关文章推荐
- 第116讲:Hadoop集群之安装Java、创建Hadoop用户、配置SSH等实战学习笔记
- 反射(java基础)
- javaSE 学习笔记
- jdk配置
- java23中设计模式之工厂模式
- [JAVA基础]JAVA中为什么引入范型?
- java将文本内容读入到List中
- Java三星题之显示日期
- Java Script基础10-13笔记
- Java学习日记-5 关键字static和final 以及接口
- spring4+quartz2.2.1
- java语言基础
- 泡泡带你看java script
- Spring容器的工具类
- spring scope
- 学习JdbcTemplate 时 用到回调函数
- 如何用jar命令将Java打包成jar文件详解
- struts2封装请求参数
- Java语法糖3:泛型
- Spring传播属性