zoukankan      html  css  js  c++  java
  • 动态代理模式

    package com.base.pattern.test;
    
    /**
     * 明星接口,用于给子类实现
     * 
     * @author Wei
     * @time 2016年9月27日 下午9:09:46
     */
    public interface Star {
    	public void actMovie();
    
    	public void sing();
    }
    

      

    被代理类:

    package com.base.pattern.test;
    
    /**
     * 真实类,需要被代理的类
     * 
     * @author Wei
     * @time 2016年9月27日 下午9:09:16
     */
    public class RealStar implements Star {
    
    	@Override
    	public void actMovie() {
    		System.out.println("RealStar actMovie");
    	}
    
    	@Override
    	public void sing() {
    		System.out.println("RealStar sing a song");
    	}
    
    }
    

      

    被代理类的处理类:

    package com.base.pattern.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    import com.util.UtilTime;
    
    /**
     * 通过实现 InvocationHandler接口以实现动态代理 就如静态代理一样, 不管是静态代理还是动态代理,都需要传入一个被代理类
     * 
     * @author Wei
     * @time 2016年9月27日 下午9:10:33
     */
    public class StarHandler implements InvocationHandler {
    	// 声明一个被代理类变量,用于接收构造器里传入的被代理对象
    	RealStar realStar;
    
    	/**
    	 * 传入被代理类,
    	 * 
    	 * @param realStar
    	 */
    	public StarHandler(RealStar realStar) {
    		this.realStar = realStar;
    	}
    	/**
    	 * proxy :不能调用 toString方法,否则会陷入死循环。
    	 * method: 被代理类的方法,用于代码中使用反射
    	 * args:   被代理类的method方法需要用的参数
    	 */
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		// 获取代理类的方法名
    		String methodName = method.getName();
    		System.out.println(UtilTime.getCurrentTime(null) + "将要真正执行代理的方法:" + methodName);
    		// 固定的写法,调用被代理类的方法
    		method.invoke(realStar, args);
    		System.out.println(UtilTime.getCurrentTime(null) + "已经执行完代理的方法:" + methodName);
    		System.out.println();
    		return null;
    	}
    
    }
    

      

    测试类:

    package com.base.pattern.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * 代理类测试
     * 
     * @author Wei
     * @time 2016年9月27日 下午10:08:08
     */
    public class test {
    	public static void main(String[] args) throws InterruptedException {
    
    		RealStar realStar = new RealStar();
    		ClassLoader loader = realStar.getClass().getClassLoader();
    		Class<?>[] interfs = realStar.getClass().getInterfaces();
    		// 传入被代理类,也就是真正的明星类
    		InvocationHandler h = new StarHandler(realStar);
    		// 生成代理类,这是至关重要的一步
    		Star proxy = (Star) Proxy.newProxyInstance(loader, interfs, h);
    
    		proxy.sing();
    		Thread.sleep(1000);
    		proxy.actMovie();
    	}
    }
    

      

    控制台输出:

    2016.09.27 22:07:55 CST将要真正执行代理的方法:sing
    RealStar sing a song
    2016.09.27 22:07:55 CST已经执行完代理的方法:sing

    2016.09.27 22:07:56 CST将要真正执行代理的方法:actMovie
    RealStar actMovie
    2016.09.27 22:07:56 CST已经执行完代理的方法:actMovie

  • 相关阅读:
    java简单计算器,只能鼠标点击数字
    可以掉落和滑动的星星
    servlet生成数字验证码
    web服务器底层-http请求与相应
    Codeforces 990D Graph And Its Complement 【构造】【性质】
    2018美团CodeM编程大赛 Round A Problem 2 下棋 【贪心】
    Codeforces 988F Rain and Umbrellas 【dp】
    Codeforces 988D Points and Powers of Two 【性质】【卡常】
    Codeforces 981D Bookshelves 【dp】【性质】
    POJ 2104 K-th Number 【主席树】【不带修改】
  • 原文地址:https://www.cnblogs.com/Sunnor/p/5914534.html
Copyright © 2011-2022 走看看