GOF23的一些总结(七)
来源:互联网 发布:32位与62位的区别 知乎 编辑:程序博客网 时间:2024/05/24 05:35
Dynamic Proxy 包含:其中有最常见的两种,JDK动态代理和CGLIB;还有javaassist,ASM(底层使用指令,可维护性较差);本文主要讨论java的JDK动态代理(反射机制。java.lang.reflect.proxy,java.lang.reflect.InvocationHandler(处理器接口))
下面是jdk动态代理的代码:
需要实现功能接口
package com.dasenlin.cn;/** * Star需要满足的某些功能 * @author Administrator * */public interface Star { void singContact(); void contactWay(); void bookStick(); void Sing();}
真正功能实现类
package com.dasenlin.cn;/** * 具体的歌者所要实现的功能 * @author Administrator * */public class RealStar implements Star { @Override public void singContact() { System.out.println("RealStar.singContact()"); } @Override public void contactWay() { System.out.println("RealStar.contactWay"); } @Override public void bookStick() { System.out.println("RealStar.bookStick"); } @Override public void Sing() { System.out.println("周杰伦RealStar.Sing"); }}
代理类
package com.dasenlin.cn;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * jdk自带的动态代理 * @author Administrator * */public class StarHandler implements InvocationHandler { /** * 需要传递的参数 */ private Star realStar; /** * 一个构造器负责传递参数 * @param realStar */ public StarHandler(Star realStar) { super(); this.realStar = realStar; } /** * java自带的的代理助手所包含的 * 所有的方法被代理后都会走到这个invoke方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj=null; System.out.println("方法处理前"); if(method.getName().equals("Sing")){ obj=method.invoke(realStar, args);//这是假设有返回参数的 } System.out.println("方法处理后"); return obj; }}
测试类
package com.dasenlin.cn;import java.lang.reflect.Proxy;/** * 实现代理类 * @author Administrator * */public class Client { /** * @param args */ public static void main(String[] args) { Star realStar = new RealStar(); StarHandler handler =new StarHandler(realStar); Star proxy =(Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class},handler); proxy.bookStick(); proxy.Sing(); }}
0 0
- GOF23的一些总结(七)
- GOF23的一些总结(一)
- GOF23的一些总结(二)
- GOF23的一些总结(三)
- GOF23的一些总结(四)
- GOF23的一些总结(五)
- GOF23的一些总结(六)
- GOF23的一些总结(八)
- GOF23的一些总结(九)
- GOF23的一些总结(十)
- GOF23的一些总结(十一)
- GOF23的一些总结(十二)
- GOF23的一些总结(十三)
- GOF23的一些总结(十四)
- GOF23的一些总结(十五)
- GOF23的一些总结(十六)
- GOF23的一些总结(十八)
- GOF23的一些总结(十九)
- Html5 中的新特性,及每种标签的使用
- mysql 时区报错
- sql server表分区
- 2016年GRE考试回顾及2017年GRE备考策略
- 1002. 计算二叉查找树的高度
- GOF23的一些总结(七)
- C语言中的nan和inf使用
- 41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
- 解决 二个java环境不同 java compiler level does not match the version of the installed java project facet
- xUtils3常见使用方法
- 循环神经网络教程-第二部分 用python numpy theano实现RNN
- HDU 4288 线段树 + 离线处理
- android wifi setWifiEnable(true)
- Ipad Usb开发