• Java动态代理详解


    Java动态代理只对实现了接口方法的实现类有效,接口和实现类代码如下:

    package com.coshaho.reflect;
    
    public interface Subject 
    {
        String doSomething();
    }
    package com.coshaho.reflect;
    
    public class RealSubject implements Subject
    {
    
        @Override
        public String doSomething() 
        {
            System.out.println("Execute Service.");
            return "Done";
        }
    
    }

    Java动态代理使用步骤:

    1、 创建动态代理方法处理器(实现InvocationHandler接口);

    package com.coshaho.reflect;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * 动态代理方法处理器
     * @author coshaho
     *
     */
    public class ProxyHandler implements InvocationHandler
    {
        /**
         * 需要被代理的类
         */
        private Object obj;
        
        ProxyHandler(Object obj)
        {
            this.obj = obj;
        }
    
        /**
         * method: 代理类需要被调用的方法
         * args: 动态代理类方法被调用时传入的参数
         * proxy: 动态代理类自身,一般无用
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable
        {
            System.out.println("Log: Service Begin.");
            
            Object result = method.invoke(obj, args);
            
            System.out.println("Log: Service Done.");
            
            return result;
        }
    
    }

    注:这里需要注意的是,动态代理方法处理器实例一般需要包含被代理类(obj)。invoke函数在动态代理类被调用接口方法时被调用,参数为动态代理类自身,被代理类需要被调用的方法,动态代理类调用接口方法时传入的参数。
    2、 创建动态代理类并使用。

    package com.coshaho.reflect;
    
    import java.lang.reflect.Proxy;
    
    public class DynamicProxy 
    {
        public static void main(String[] args)
        {
            Subject subject = new RealSubject();
            
            /**
             * Proxy.newProxyInstance
             * 参数1: 动态代理类需要的ClassLoader
             * 参数2: 动态代理类实现的接口列表
             * 参数3: 动态代理类处理器
             */
            Subject proxySubject = (Subject)Proxy.newProxyInstance(
                    subject.getClass().getClassLoader(), 
                    new Class[]{Subject.class}, 
                    new ProxyHandler(subject));
            
            proxySubject.doSomething();
        }
    
    }

     源码分析可以参考:http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

  • 相关阅读:
    Linux命令详解之—tail命令
    Linux命令详解之—less命令
    Linux命令详解之—more命令
    Linux命令详解之—cat命令
    Linux命令详解之—pwd命令
    Linux命令详解之–cd命令
    ubuntu-14.04安装最新tensorflow记录
    rn最新版测试
    boost asio死锁一例
    dskinlite自适应dpi
  • 原文地址:https://www.cnblogs.com/coshaho/p/5118109.html
Copyright © 2020-2023  润新知