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
原创粉丝点击