Java-动态代理
来源:互联网 发布:德拉蒙德数据 编辑:程序博客网 时间:2024/05/16 13:03
一、动态代理作用
1.1、JavaWeb框架,如Spring、Struts2中使用;
3.1、指定接口
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
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- java与云计算之间的关系
- cocos2d libjson数据解析
- 再次免费发一个Qt教程,希望能帮助各位Qt初学者快速入门
- 分享一些Qt学习资源,欢迎下载
- java之序列化学习笔记(高效java之序列化)
- Java-动态代理
- 软件项目开发中的二八现象
- Cocos2d之CCScene
- 掌声送给社会人
- Android的ImageView中的android:src和android:background的区别
- 【训练计划】杭电acm阶段之理工大版
- Avatar boby mask
- [最短路径] HDU 1596 - find the safest road
- 树莓派入门二之GPIO控制LED灯