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

  • 相关阅读:
    使用 javascript 替换 jQuery
    几个非常实用的JQuery代码片段
    分析ajax请求过程以及请求方法
    使用mpvue开发github小程序总结
    Element UI table组件源码分析
    使用web-component搭建企业级组件库
    vue项目开发过程常见问题
    vue权限路由实现方式总结
    关于父组件通过v-on接收子组件多个参数的一点研究
    vue使用flexible和px2rem实现移动端适配
  • 原文地址:https://www.cnblogs.com/coshaho/p/5118109.html
Copyright © 2011-2022 走看看