码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理简介

时间:2015-08-01 11:35:13      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:java

1、什么是动态代理?
        说起动态,其实不如先说什么是静态。所谓静态代理,由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。总之,就是程序运行前就已经存在的编译好的代理类。

        相反,如果代理类程序运行前并不存在,在程序运行时,运用反射机制动态创建而成(无需手工编写代理类源码),那就是今天要说的动态代理了。

2、实现原理

        和动态代理有关的有两个类 

1)、interface InvocationHandler
Object invoke(Object proxy, Method method, Object[] args)
用来代理我们要做的N多事情。

2)、class Proxy
真正表示动态代理的类,提供两个静态方法:

Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface)
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”,
用来冒充真实的对象。

Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类),
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法

3)、代理图
        技术分享

3、代码展示

        1)、UserManager:

<span style="font-size:18px;">    public interface UserManager {
        public void addUser(String userId,String userName);
        
        public void delUser(String userId);
        
        public void modifyUser(String userId,String userName);
        
        public String QueryUser(String userId);
    }</span>
2)、UserManagerImpl:
<span style="font-size:18px;">    public class UserManagerImpl implements UserManager {

        @Override
        public void addUser(String userId, String userName) {
            System.out.println("UserManagerImpl.addUser()");
        }

        @Override
        public void delUser(String userId) {
            System.out.println("UserManagerImpl.delUser()");
        }

        @Override
        public void modifyUser(String userId, String userName) {
            System.out.println("UserManagerImpl.modifyUser()");
        }

        @Override
        public String QueryUser(String userId) {
            System.out.println("UserManagerImpl.QueryUser()");
            return "zhangsan";
        }
    }</span>
3)、UserManagerImpl的动态代理:
<span style="font-size:18px;">    public class LogHandler implements InvocationHandler {

        private Object targetObject;

        public Object newProxyInstance(Object targetObject){
            this.targetObject=targetObject;
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 
                    targetObject.getClass().getInterfaces(), this);
        }

        @Override
        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;
        }
    }</span>
4)、客户端调用:
public static void main(String[] args) {
        LogHandler logHandler=new LogHandler();
        UserManager userManager=(UserManager)logHandler.newProxyInstance(new UserManagerImpl());
        //userManager.addUser("1", "zhangsan");
        String userName=userManager.QueryUser("1");
        System.out.println("userName:"+userName);    
    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

动态代理简介

标签:java

原文地址:http://blog.csdn.net/u010927139/article/details/47184097

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!