代码改变世界

基于jdk proxy的动态代理模式

2014-04-12 16:46  VinpleZhang  阅读(264)  评论(0编辑  收藏  举报

代理模式 是spring AOP机制的实现基础,有必要学习一下。

有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。

先看一组代码,

package com.sinosoft.proxy;

public interface UserInterface {
    
    public abstract void add();
    public abstract void delete();

}


package com.sinosoft.proxy;

public class UserInterfaceImpl implements UserInterface{

    @Override
    public void add() {
        System.out.println("add add add");
        
    }

    @Override
    public void delete() {
        // TODO Auto-generated method stub
        System.out.println("delete delete delete");
    }
    

}

输出结果如下,

现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
该怎么做?
我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
由代理对象来完成该功能。

第一,JDK动态代理方式

package com.sinosoft.proxy;

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

public class ProxyFactory implements InvocationHandler{
    private Object target;
    
    private ProxyFactory(){}
    
    public static ProxyFactory getInstance(){
        
        //Runtime
        return new ProxyFactory();
    }
    
    public Object getProxy(Class clazz){
        Object proxy=Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
        return proxy;
            
    }

    @Override
    public Object invoke(Object object, Method method, Object[] params)
            throws Throwable {
        // TODO Auto-generated method stub
        Object retVal=null;
        try {
            System.out.println("before....");
            retVal=method.invoke(target, params);
            System.out.println("ater.....");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("exception.....");
        }finally{    
            System.out.println("finally....");
        }
        return retVal;
    }
}


package com.sinosoft.proxy;

import org.junit.Test;

public class ProxyTest {
    @Test
    
    //public static void main(String[] args) {
    public void test1(){
        
        UserInterfaceImpl userimpl=new UserInterfaceImpl();
        userimpl.add();
        userimpl.delete();
    }
        
    //}
    
    @Test
    public void test2(){
        ProxyFactory factory=ProxyFactory.getInstance();
        
        UserInterface userinterface=(UserInterface)factory.getProxy(new UserInterfaceImpl().getClass());
        
        System.out.println(userinterface.getClass());
        userinterface.add();
        userinterface.delete();
        
    }

}