Java-动态代理

来源:互联网 发布:德拉蒙德数据 编辑:程序博客网 时间:2024/05/16 13:03
一、动态代理作用
1.1、JavaWeb框架,如Spring、Struts2中使用;

1.2、日常优秀代码。


二、动态代理说明

类Proxy中的静态方法newProxyInstance()返回的是实现了指定接口的实现类对象,甚至你都没有看见实现类的代码。


三、示例
3.1、指定接口
package cn.yjx.java.proxy;import java.util.Date;public interface Waiter {public String service(Date date);}

3.2、实现类,含具体业务

package cn.yjx.java.proxy;import java.text.SimpleDateFormat;import java.util.Date;public class ManWaiter implements Waiter{@Overridepublic String service(Date date) {String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);System.out.println("true business: service for you at " + dateStr); // 具体业务逻辑(对此业务逻辑进行前置、后置增强)return "service for you at " + dateStr;}}
3.3、测试类

package cn.yjx.java.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Date;public class ProxyTest2 {public static void main(String[] args) {// 生成实现了Waiter接口的代理对象ClassLoader loader = ProxyTest2.class.getClassLoader();Class[] interfaces = {Waiter.class};final Waiter waiter = new ManWaiter();InvocationHandler handler = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("pre: say welcome"); // pre增强// 当代理对象的方法被调用时,你调用代理对象的什么方法,我就调用waiter的什么方法(调用类ManWaiter的service(*)方法)Object resultValue = method.invoke(waiter, args);System.out.println("post: say  bye"); // post增强//System.out.println("---method.getName(): " + method.getName());//System.out.println("---Arrays.asList(args): " + Arrays.asList(args));return resultValue; }};Object proxy = Proxy.newProxyInstance(loader, interfaces, handler);  Waiter waiterProxy = (Waiter) proxy;String returnVal = waiterProxy.service(new Date()); System.out.println("returnVal: " + returnVal);}}
测试结束。

另,也可将InvocationHandler的匿名内部类单独拿出来

package cn.yjx.java.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.Arrays;public class WaiterInvocationHandler implements InvocationHandler {private Waiter waiter;public WaiterInvocationHandler(Waiter waiter) {this.waiter = waiter;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("pre: say welcome"); // pre增强// 当代理对象的方法被调用时,你调用代理对象的什么方法,我就调用waiter的什么方法Object resultValue = method.invoke(waiter, args);System.out.println("post: say  bye"); // post增强//System.out.println("---method.getName(): " + method.getName());//System.out.println("---Arrays.asList(args): " + Arrays.asList(args));return resultValue; }}

测试结果



另,




0 0
原创粉丝点击