zoukankan      html  css  js  c++  java
  • java动态代理

    代理:为其他对象提供代理,来控制对该对象的访问。起到客户端和目标对象之间的中介作用。(转:http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html

    代理模式:主要涉及到三方面:抽象接口、代理类、被代理类。代理对象与被代理对象有同样的接口。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。(转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

    java动态代理机制,可采用如下方式使用,代码说明:

    //抽象接口
    public interface MyInterface {
        public void doSomething1();
        public void doSomething2();
        public void doSomething3(String s);
    }
    //被代理类,目标对象
    public class MyImpl implements MyInterface {
        @Override
        public void doSomething1() {
            // TODO Auto-generated method stub
            System.out.println("doSomethings1");
    
        }
        @Override
        public void doSomething2() {
            // TODO Auto-generated method stub
            System.out.println("doSomethings2");
        }
        @Override
        public void doSomething3(String s) {
            // TODO Auto-generated method stub
            System.out.println("doSomething3 print:" + s);
        }
    }
    //InvocationHandler接口实现类,含有目标对象的引用,需要实现invoke方法
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class MyInvocationHandler implements InvocationHandler {
        //代理的实际对象引用
        private MyInterface obj;
        public MyInvocationHandler(){
            
        }
        public MyInvocationHandler(MyInterface obj){
            this.obj = obj;
        }
    
        @Override
        public Object invoke(Object arg0, Method arg1, Object[] arg2)
                throws Throwable {
            // TODO Auto-generated method stub
            /*int flag = 1;
            if(arg1.getName().equals("doSomething1"))
                flag = 1;
            else if(arg1.getName().equals("doSomething2"))
                flag = 2;
            else
                flag = 3;*/
            //预处理
            //System.out.println("start up doSomething" + flag);
            System.out.println("start up doSomething");
            //调用目标对象的方法
            arg1.invoke(obj, arg2);
            //结束处理
            System.out.println("clean up doSomething");
            //System.out.println("clean up doSomething" + flag);
            return null;
        }
    
    }
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    
    public class test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建目标对象
            MyInterface obj = new MyImpl();
            //创建InvocationHandler对象
            InvocationHandler invoker = new MyInvocationHandler(obj);
            //创建代理对象,调用Proxy的newProxyInstance方法
            MyInterface proxy = (MyInterface)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), invoker);
            //调用代理方法,实际上回调用目标对象的方法
            proxy.doSomething1();
            System.out.println();
            proxy.doSomething2();
            System.out.println();
            proxy.doSomething3("HelloWorld");
        }
    
    }

    动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理。(转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

    一致对java动态代理搞不懂,这次稍微看了下,我的理解是,java动态代理是针对接口的,而一个接口可以被多个类实现,这样可以省去为每个实现类创建代理类,大大减少了重复代码的编写,不知道是不是这样?这一块理解还是很浅,先记录下,后面在看看。

    内容主要参考了下面两篇博客,万分感谢!!

    http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

    http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html

  • 相关阅读:
    Ceph实验室:第六课:Ceph运维之横向扩展
    Ceph实验室:第五课:Ceph运维之换盘
    百度2014软件开发工程师笔试题详解 (转)
    阿里巴巴2014笔试题详解(9月22北京)(转)
    阿里巴巴2014秋季校园招聘-软件研发工程师笔试题详解(转)
    腾讯的2014年校招的软开笔试题(转)
    typedef与define区别
    java流总结(转)
    java 流 复制,重命名,删除目录
    java 流 读
  • 原文地址:https://www.cnblogs.com/aitixiaocai/p/4996125.html
Copyright © 2011-2022 走看看