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

 

posted @ 2016-01-10 11:40  coshaho  阅读(648)  评论(0编辑  收藏  举报