• jdk动态代理(一)


    客户端

    package com.robert.reflect;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    //客户端
    
    public class Client
    {
    	static public void main(String[] args) throws Throwable
    	{
    		Subject rs = new RealSubject(); // 在这里指定被代理类
    		InvocationHandler ds = new DynamicSubject(rs);
    		Class<?> cls = rs.getClass();
    
    		// 以下是一次性生成代理
    
    		Subject subject = (Subject) Proxy.newProxyInstance(
    				cls.getClassLoader(), cls.getInterfaces(), ds);
    
    		subject.request();
    	}
    }
    


    //代理处理器

    package com.robert.reflect;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    //代理处理器 
    
    /**
     * 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;
     * 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args);
     * 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,
     * args为执行被代理对象相应操作所需的参数。
     * 通过动态代理类,我们可以在调用之前或之后执行一些相关操作
     */
    
    public class DynamicSubject implements InvocationHandler
    {
        private Object sub;
    
        public DynamicSubject()
        {
        	
        }
    
        public DynamicSubject(Object obj)
        {
            sub = obj;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
        {
            System.out.println("before calling " + method);
    
            method.invoke(sub, args);
    
            System.out.println("after calling " + method);
    
            return null;
    	}
    
    }
    

    //具体角色

    package com.robert.reflect;
    
    //具体角色
    
    public class RealSubject implements Subject
    {
        public void request()
        {
            System.out.println("From real subject.");
        }
    
    }
    


    //抽象角色(之前是抽象类,此处应改为接口):

    package com.robert.reflect;
    
    //抽象角色(之前是抽象类,此处应改为接口): 
    
    public interface Subject
    {
        abstract public void request();
    }
    



    此代码出自浪曦教育,该代码仅供学习,如有问题请联系本人,qq362601125

  • 相关阅读:
    算法训练 接水问题
    算法训练 数组排序去重
    算法训练 A+B Problem
    算法训练 采油区域
    算法训练 会议中心
    JS高级
    JS基础操作
    JavaScript入门(基础)
    表格与表单
    音频与视频
  • 原文地址:https://www.cnblogs.com/mengjianzhou/p/5986857.html
Copyright © 2020-2023  润新知