您的位置:首页 > 编程语言 > Java开发

jdk自带的动态代理说明

2012-06-07 17:42 225 查看
动态代理:采用jdk下lang包的reflect类中的|Proxy的newProxyInstance(...)来实例化被代理的类

                                                                                |实现了InvocationHandler接口的代理类的invoke来封装被代理的方法

具体实现见test_dynamic_proxy_pattern类及drp中TransactionHandler和FlowCardServlet类(用动态代理处理事务)

newProxyInstance方法解释:

public static Object newProxyInstance(ClassLoader loader,        ————>指定代理类的类加载器

                                                                            Class<?> interfaces,    ————>代理类要实现的接口列表

                                                                            InvocationHandler h)    ————>指派方法调用的调用处理程序,InvocationHandler对象

test_dynamic_proxy_pattern中代理类示例:                                                                                                                                                

public class LogHandler implements InvocationHandler {

    

    private Object targetObject;    

    public Object newProxyInstance(Object targetObject) {    //该方法会在客户端的Client类中被调用

        this.targetObject = targetObject;

        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),    //指定被代理的类的类加载器

                               targetObject.getClass().getInterfaces(),    //指定被代理类的接口数组

                               this);    //指定当前代理类

    }    

    public Object invoke(Object proxy,    //

                        Method method,    //被代理的方法

                        Object[] args)    //被代理的方法的参数数组

            throws Throwable {

        System.out.println("start-->>" + method.getName());

        for (int i=0; i<args.length; i++) {

            System.out.println(args[i]);

        }

        Object ret = null;

        try {

            //调用目标方法

            ret = method.invoke(targetObject,    //目标类

                                args);    //方法的参数数组

            System.out.println("success-->>" + method.getName());

        }catch(Exception e) {

            e.printStackTrace();

            System.out.println("error-->>" + method.getName());

            throw e;

        }

        return ret;    //将方法的执行结果返回客户端的方法结果中

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息