JDK动态代理的简单理解

转载:http://www.cnblogs.com/luotaoyeah/p/3778183.htmlhtml

动态代理java

  代理模式是 Java 中的经常使用设计模式,代理类经过调用被代理类的相关方法,提供预处理、过滤、过后处理等服务,动态代理及经过反射机制动态实现代理机制。JDK 中的 java.lang.reflect.Proxy 类能够用来实现动态代理。设计模式

首先,准备一个简单的接口和实现类ide

/**
 * 接口 IHello.java
 */
public interface IHello {
    void hello();
}
/**
 * 实现类 Hello.java
 */
public class Hello implements IHello {
    @Override
    public void hello() {
        System.out.println("我是Hello.");
    }
}

经过 Proxy 实现动态代理spa

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.junit.Test;

public class HelloTest {
    @Test
    public void testProxy() throws Exception {
        final IHello hello = new Hello();

        /*
         * proxyHello    : 代理主题角色,代理类的实例 
         * IHello        : 抽象主题角色,代理类和被代理类都须要实现的接口,JDK中的动态代理必须针对接口
         * hello         : 真实主题角色,被代理类的实例
         */
        IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                new Class[] { IHello.class }, new InvocationHandler() {

                    /*
                     * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将形成无限循环调用.
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                        // 前置的业务逻辑操做
                        System.out.println("---开始");

                        // 调用被代理类的方法,传入参数args,获得返回
                        Object object = method.invoke(hello, args);

                        // 后置的业务逻辑操做
                        System.out.println("---结束");

                        return object;
                    }
                });

        proxyHello.hello();
    }
}
相关文章
相关标签/搜索