动态代理-增强方法
来源:互联网 发布:行车证制作软件 编辑:程序博客网 时间:2024/05/21 10:12
方法的增强
*继承:能够控制这个类 *装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用. 接口中方法过多,只增强其中的某个方法.其他的方法也需要重写. *动态代理:被增强的类实现了接口.
代理的概述
代理:JDK中动态代理:Proxy对象.* Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih);
在使用装饰着模式去增强某个类的时候会发现当被增强的那个类所实现的接口中含有的方法有很多个时,我们就需要将全部的方法都进行重写,显然这是不符合开发的习惯的,那有没有一种方式可以之增强我们需要的那个方法呢,下面还是以案例的形式来进行分析。 我们首先需要对Proxy有一定了解:1、 Proxy是位于java.lang.reflect下的类;2、 Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。3、使用此简便方法来实现接口Foo代理:Foo f = (Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(), newClass[] { Foo.class }, handler);如果想对动态代理有更多的了解请查看jdkAPI文档。
利用动态代理模式来增强方法
在使用装饰着模式去增强某个类的时候会发现当被增强的那个类所实现的接口中含有的方法有很多个时,我们就需要将全部的方法都进行重写,显然这是不符合开发的习惯的,那有没有一种方式可以之增强我们需要的那个方法呢,下面还是以案例的形式来进行分析。
我们首先需要对Proxy有一定了解:
1、 Proxy是位于java.lang.reflect下的类;
2、 Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
3、使用此简便方法来实现接口Foo代理:Foo f = (Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(),
newClass[] { Foo.class },
handler);
如果想对动态代理有更多的了解请查看jdkAPI文档。
代码如下:
接口类:Waiter
- public interface Waiter {
- public void serve();
- public String sayhello();
- }
实现类:Waitress
- public class Waitress implements Waiter {
- @Override
- public void serve() {
- System.out.println("您要点儿什么呢?");
- }
- @Override
- public String sayhello() {
- System.out.println("hello world");
- return null;
- }
- }
代理类:ProxyDemo
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import org.junit.Test;
- public class ProxyDemo {
- @Test
- public void strengthen(){
- //获得要增强实现类的对象
- final Waiter waiter = new Waitress();
- /*
- * Proxy为代理类。
- * newProxyInstance为Proxy的静态方法,此方法用于实现动态代理
- * 返回值为增强类要实现的接口对象
- * 此方法需要接受三个参数:类加载器、被增强类所要实现的全部接口、处理类
- *
- */
- //类加载器
- ClassLoader classLoader = waiter.getClass().getClassLoader();
- //被增强类所要实现的全部接口
- Class<?>[] interfaces = waiter.getClass().getInterfaces();
- //处理类一般是通过创建匿名内部类来实现的。
- Waiter waiterProxy = (Waiter)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
- /*
- * proxy:产生的代理对象的引用
- * method:当前正在调用的目标类的方法
- * params:只在执行的方法中的参数。
- */
- //需要注意的是我们无论调用waiterProxy中的任何方法都会执行invoke。所以我们可以在invoke中做一个判断,
- //从而只执行我们想要的方法。
- @Override
- public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
- //根据方法名来执行我们需求中的方法。
- if("serve".equals(method.getName())){
- System.out.println("欢迎光临");
- //这里我们使用了method的invoke来执行waiterProxy中的方法。
- Object object = method.invoke(waiter, params);
- System.out.println("谢谢光临");
- return object;
- }else{
- //只执行了原来的方法,没有进行增强。
- Object object = method.invoke(waiter, params);
- return object;
- }
- }
- });
- waiterProxy.serve();
- //waiterProxy.sayhello();
- }
- }
阅读全文
0 0
- 动态代理-增强方法
- 利用动态代理模式来增强方法
- 前置增强 ,后置增强,异常增强,环绕增强 静态代理,动态代理
- 增强 修改对象的集中方法(继承、装饰者模式、动态代理)
- spring 代理对象方法增强源码解析
- spring : advice 前增强、后增强、环绕增强、异常增加 --其实就是动态代理
- 代理、动态代理、基于模版方法的动态代理
- 使用动态代理实现对request和response的增强
- java基础增强---Java 类加载器与动态代理
- 采用动态代理的方式对一个类进行增强
- 委托(5)代理动态方法
- JAVA动态代理实现方法
- jdk动态代理拦截方法
- 动态代理模式+tostring方法
- spring 代理对象方法增强源码解析222222
- Spring 顾问 代理 增强
- Sping 顾问代理增强
- Spring 顾问 代理增强
- 关于用户 root密码忘记时的密码重制
- logback的使用和logback.xml详解
- linux内核驱动模块开发makefile实例解析
- construct2 游戏制作
- (完)learn python第五章:更多类 (第六节:递推式构造列表list comprehensions)
- 动态代理-增强方法
- C 语言 简单桶排序 算法&实现
- Django自定义数据段问题即 [] is not JSON serializable(数组非JSON序列化)
- bzoj2465: [中山市选2009]小球
- Java:方法
- qml 动态创建TableView
- 基于ORA-12170 TNS 连接超时解决办法详解
- 线段树
- UVa10859 Placing Lampposts(双元限制的dp)