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

    动态代理其实也是代理的一种,所谓动态在于我们的代理类可以适用于所有类型的被代理对象,这一点其实跟PHP的__call()方法是一样的。

    public interface Flyable {
        void fly();
    }
    
    public class Eagle implements Flyable {
        @Override
        public void fly() {
            System.out.println("I am eagle, I can fly in 100 km/h");
        }
    }
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class DynamicProxy implements InvocationHandler {
        private Object proxied = null;
        public DynamicProxy(Object proxied) {
            this.proxied = proxied;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("Using dynamic proxy " + proxy.getClass() +
                    " method : " + method + " args : " + args);
            return method.invoke(proxied, args);
        }
    }
    
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
            Eagle eagle = new Eagle();
            Flyable flyProxy = (Flyable) Proxy.newProxyInstance(
                        Flyable.class.getClassLoader(),
                        new Class[] { Flyable.class },
                        new DynamicProxy(eagle)
                    );
            flyProxy.fly();
        }
    }

    Java的动态代理理解起来有点绕,他需要一个InvocationHandler对象,这个东西就是我们的代理对象,里面放了一个Object proxied,这个就是被代理对象,invoke()方法其实就是在用反射在调用proxied的方法。客户端使用Proxy.newProxyInstance()方法创建代理类,需要传入的参数有ClassLoader,代理类需要实现的接口的Class,以及代理类,当然还有代理类的里面的proxied实例。关于代理的好处参见这里 http://www.cnblogs.com/zemliu/archive/2012/05/20/2509377.html

  • 相关阅读:
    Python 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/zemliu/p/2765518.html
Copyright © 2011-2022 走看看