GOF23的一些总结(七)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值