动态代理 dynamicProxy

使用代理处理类,需要实现InvocationHandler接口

package com.lan.dynamicProxy.myDynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 上午10:12
 * To change this template use File | Settings | File Templates.
 */
public class MyHandler implements InvocationHandler {

    /**
     * 需要实现动态代理的目标对象
     */
    private final Object target;

    public MyHandler(Object target) {
        this.target = target;
    }

    /**
     * 只要实现了InvocationHandler,并且接收一个对象作为参数,就可以为该对象建立动态代理了
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("事务处理前..."+"invoke --  "+method.getName()+" : "+ Arrays.deepToString(args));
        Object result = method.invoke(target, args);//To change body of implemented methods use File | Settings | File Templates.
        System.out.println("事务处理后");
        return result;
    }

     static void myproxy(){

     }
}

接口1

package com.lan.dynamicProxy.myDynamicProxy;

/**
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 上午10:15
 * To change this template use File | Settings | File Templates.
 */
public interface MyInterface {
    public void sing(String name);
    public void jump(String name);
    public void sleep(String name);
}

接口2

package com.lan.dynamicProxy.myDynamicProxy;

/**
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 上午10:15
 * To change this template use File | Settings | File Templates.
 */
public interface MyInterface1 {
    public void greet(String greet);
}

一般业务类,实现类上面的2个接口:MyInterface,MyInterface1

package com.lan.dynamicProxy.myDynamicProxy;

/**
 * 这就是需要实现动态代理的目标类
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 上午10:16
 */
public class MyImpl implements MyInterface, MyInterface1 {
    @Override
    public void sing(String name) {
        System.out.println(name + "小鸟在歌唱");
    }

    @Override
    public void jump(String name) {
        System.out.println(name + "我不是跳蚤");
    }

    @Override
    public void sleep(String name) {
        System.out.println(name + "小熊在睡觉");
    }

    @Override
    public void greet(String greet) {
        System.out.println("Hello," + greet);
    }
}

测试类:

package com.lan.dynamicProxy.myDynamicProxy;

import com.lan.dynamicProxy.LoggingInvocationHandler;

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 上午10:18
 * To change this template use File | Settings | File Templates.
 */
public class Test {
    static  void test0(){
        //首先建立一个目标对象
        MyImpl impl=new MyImpl();
        //将目标对象传给实现了接口InvocationHandler的处理业务实现类
        MyHandler myHandler=new MyHandler(impl);

        //创建一个动态代理对象,arg0:targetObject的一个classLoader实例,arg1:目标对象实现的接口,arg2:处理业务实现类
//        MyInterface myInterface= (MyInterface) Proxy.newProxyInstance(MyImpl.class.getClassLoader(), new Class[]{MyInterface.class,MyInterface1.class}, myHandler);
        Object obj=Proxy.newProxyInstance(impl.getClass().getClassLoader(),impl.getClass().getInterfaces(),myHandler);
        MyInterface myInterface= (MyInterface) obj;
        //调用目标对象的接口的方法
        myInterface.jump("小明,");
        MyInterface1 myInterface1= (MyInterface1) myInterface;
        myInterface1.greet("Bom");

    }
    
    /**如果实现的接口出现同名方法,那么实现排在前面的方法*/
    public static void test1(){
        List list=new ArrayList();
        LoggingInvocationHandler handler=new LoggingInvocationHandler(list);
        Object proxy=Proxy.newProxyInstance(list.getClass().getClassLoader(),new Class[]{List.class,Set.class},handler);
        //如果换成这句,下面就会出错,因为handler接受到的是ArrayList对象,其并未实现Set接口,若Set.class排在前面,代理对象实现的是Set接口中的add方法
//        Object proxy=Proxy.newProxyInstance(list.getClass().getClassLoader(),new Class[]{Set.class,List.class},handler); 
        List proxylist= (List) proxy;
        Set proxySet= (Set) proxy;
        proxylist.add("list add");
        proxySet.add("set add");
        proxylist.add(1);
        proxySet.add(1);
        System.out.println(Arrays.deepToString(proxylist.toArray()));
        System.out.println(Arrays.deepToString(proxySet.toArray()));
        System.out.println(list.hashCode()+" "+proxylist.hashCode()+" "+proxySet.hashCode());
    }
    public static void main(String[] args) {
        test1();
    }

}

使用代理工厂创建代理类:

package com.lan.dynamicProxy.myDynamicProxy;

import com.lan.dynamicProxy.LoggingInvocationHandler;

import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * User: Njoy
 * Date: 13-8-21
 * Time: 下午10:38
 * To change this template use File | Settings | File Templates.
 */
public class ProxyFactory {

    public static Object SingleInterfaceProxy(Class clz, Object target) {
        LoggingInvocationHandler handler = new LoggingInvocationHandler(target);
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), new Class[]{clz}, handler);
    }

    public static Object MultiInterfaceProxy(Class[] classes, Object target) {
        LoggingInvocationHandler handler = new LoggingInvocationHandler(target);
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), classes, handler);
    }

    public static Object AllInterfaceProxy(Object target) {
        LoggingInvocationHandler handler = new LoggingInvocationHandler(target);
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
    }


}

 

posted @ 2013-08-23 13:42  eyotata  阅读(349)  评论(0编辑  收藏  举报