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

    package com.imooc.bigdata.datafile;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /*
     * 代理模式的简单demo,动态代理,动态代理利用了反射机制
     * 每一个动态代理类都会有一个与之关联的invocation handler。真正的调用是在invocation handler的invoke()方法里完成的。
     * 感谢蝶离飞、廖新喜2为师傅的指导
     */
    
    class test{
        public static void main(String[] args) {
            DynamicSubject sub=new RealDynamicSubject();//之前这里sub的类型是RealDynamicSubject,不对;但是为什么呢?
            Handler handler = new Handler(sub);
            DynamicSubject sub2 = (DynamicSubject)Proxy.newProxyInstance(DynamicSubject.class.getClassLoader(), new Class[]{DynamicSubject.class}, handler);
            //CLassLoader loader:指定动态代理类的类加载器
            //Class<?> interfaces:指定动态代理类需要实现的所有接口
            //InvocationHandler h: 指定与动态代理类关联的 InvocationHandler对象
            DynamicSubject sub3 = (DynamicSubject)Proxy.newProxyInstance(DynamicSubject.class.getClassLoader(), sub.getClass().getInterfaces(), handler);
    
            DynamicSubject sub4 = (DynamicSubject)Proxy.newProxyInstance(DynamicSubject.class.getClassLoader(), RealDynamicSubject.class.getInterfaces(), handler);
    
    //        System.out.println("sub.getClass() = "+sub.getClass());
    //        System.out.println("DynamicSubject.class = " +DynamicSubject.class);
    //        System.out.println(new Class[]{DynamicSubject.class});
    //        System.out.println(RealDynamicSubject.class.getInterfaces());
    
            sub2.request();
            sub3.request();
            sub4.request();
        }
    }
    
    interface DynamicSubject
    {//抽象角色:通过接口或抽象类声明真实角色实现的业务方法。注意:动态代理只能是接口,否则代理类转成该类型事会报错
        //类比网络代理,比如http代理,都支持http协议
        abstract void request();
    }
    
    class RealDynamicSubject implements DynamicSubject
    {//真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理handler处理调用。
        //类比真实的http请求
        public RealDynamicSubject()
        {
        }
    
        public void request()
        {
            System.out.println("From real subject.");
        }
    }
    
    /**
     * 处理器
     */
    class Handler implements InvocationHandler{
        private Object obj; //被代理的对象,不管对象是什么类型;之前声明成RealDynamicSubject,不应该这么做
        /**
         * 所有的流程控制都在invoke方法中
         * proxy:代理类
         * method:正在调用的方法
         * args:方法的参数
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//接口必须实现的方法,也是逻辑核心
            System.out.println("Do something before requesting");
            Object xxx = method.invoke(this.obj, args);
            System.out.println("Do something after requesting");
            return xxx;
        }
        public Handler(Object obj) {
            //构造函数,把真实角色的实例传递进来,这个代理handler的目的就是处理它
            this.obj = obj;
        }
    }
    

    动态代理类需要实现的所有接口有三种写法,如上面代码。
    运行结果如下图:

    参考链接:
    http://wiki.ioin.in/post/group/NJa0

  • 相关阅读:
    WCF中的序列化[下篇]
    WCF中的序列化[上篇]
    SET TRANSACTION ISOLATION LEVEL 详解
    深入探讨数据仓库建模与ETL的实践技巧
    用SQL语句添加删除修改字段等操作
    WCF数据契约与序列化
    在SQL Server中使用检查约束来验证数据
    C#线程同步的几种方法[转]
    Linq的Join用法
    测试wlm代码高亮插件
  • 原文地址:https://www.cnblogs.com/afanti/p/10199226.html
Copyright © 2011-2022 走看看