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

  • 相关阅读:
    [LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点
    [LeetCode]77. Reverse Linked List反转链表
    [LeetCode]76. Permutation Sequence全排列序列
    [LeetCode]75. Pow(x,n)幂运算
    粘连字符分割初探~~
    验证码识别学习~~
    用VS2010编C#程序扫盲 2
    用VS2010编C#程序扫盲
    验证码降噪方法汇总~~~~~
    新生活......
  • 原文地址:https://www.cnblogs.com/zemliu/p/2765518.html
Copyright © 2011-2022 走看看