zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使SourceInsight支持Python语言的方法
    图解Join
    EularProject 42:单词解码出来的三角形数
    android-async-http二次封装和调用
    #20 Valid Parentheses
    udev详解【转】
    linux下udev简介【转】
    Linux USB 驱动开发(一)—— USB设备基础概念【转】
    Android updater-scripts(Edify Script)各函数详细说明【转】
    OTA制作及升级过程笔记【转】
  • 原文地址:https://www.cnblogs.com/mengjianzhou/p/5986857.html
Copyright © 2011-2022 走看看