• 代理模式


    1 用于实现代理。静态代理 

    如果不用InvocationHandler接口实现代理的话,我们写代码是这样的: 
    定义一个接口:

    Java code
    interface Greet { void sayHello(String name); void goodBye(); }



    实现这个接口:

    Java code
    class GreetImpl implements Greet { public void sayHello(String name) { System.out.println("Hello " + name); } public void goodBye() { System.out.println("Good bye."); } }



    实现一个代理类

    Java code
    public class SimpleProxy implements Greet { private Greet greet = null; SimpleProxy(Greet greet) { this.greet = greet; } public void sayHello(String name) { System.out.println("--before method sayHello"); greet.sayHello(name); System.out.println("--after method sayHello"); } public void goodBye() { System.out.println("--before method goodBye"); greet.goodBye(); System.out.println("--after method goodBye"); } /** * @param args */ public static void main(String[] args) { Greet greet = new SimpleProxy(new GreetImpl());//生成代理 greet.sayHello("walter"); greet.goodBye(); } }



    2  动态代理
    代理其实没什么的,再看看如果实现了InvocationHandler接口, 
    我们怎样实现代理。 
    还是要实现原来的Greet接口。 
    接口的实现还是GreetImpl。

    Java code
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class DebugProxy implements java.lang.reflect.InvocationHandler
    {
        private Object obj;
    
        public static Object newInstance(Object obj)
        {
            return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                    obj.getClass().getInterfaces(), new DebugProxy(obj));
        }
    
        private DebugProxy(Object obj)
        {
            //Greet接口的實現:GreetImpl
            this.obj = obj;
        }
    
        //Method m:調用的方法
        //Object[] args:方法要傳入的參數
        public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
        {
            Object result;
            try
            {
                //自定義的處理
                System.out.println("--before method " + m.getName());
                //調用GreetImpl中方法
                result = m.invoke(obj, args);
            }
            catch(InvocationTargetException e)
            {
                throw e.getTargetException();
            }
            catch(Exception e)
            {
                throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
            }
            finally
            {
                System.out.println("--after method " + m.getName());
            }
            return result;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            Greet tmp = new GreetImpl();
            
            Greet greet = (Greet) DebugProxy.newInstance(tmp);
            //生成的greet和tmp有相同的hashCode
            
            greet.sayHello("walter");
            greet.goodBye();
        }
    }
  • 相关阅读:
    我异常-VS2012“System.AccessViolationException: 试图读取或写入保护内存。”
    JAVA学习笔记 -- JDBC及其应用
    创建Windows类别
    非递归二叉树遍历
    如何使用Maven创建web工程(详细步骤)
    HDOJ 3966 Aragorn's Story
    SQLServer-----SQLServer 2008 R2卸载
    hdu 4869 Turn the pokers
    MTK6572横屏的调试过程
    【MongoDB】Serveral common command of MongoDb
  • 原文地址:https://www.cnblogs.com/daxiong225/p/4713992.html
Copyright © 2020-2023  润新知