美文网首页
java中的动态代理

java中的动态代理

作者: YNZXGWZM | 来源:发表于2018-10-18 19:00 被阅读0次

    动态代理理解:
    举个例子吧,比如说你暗恋一个小美女,你给她写了个情书,你不好意思直接给她,就让我转给她。
    我也暗恋这个小美女,我收到你的情书以后,我送你的情书之前跟小美女说你这个人人品差长得丑还没钱,然后再把你的情书给她。
    动态代理就是这个过程。本来是你和小美女之间的关系,但中间让我转达一下,我在转达的前后可以干一些自己的事情。更具体的说,就是A调用B,但不直接调用,A通过调用C,C再调用B,C在调用B的前后可以做一些自己的事情,比如说打日志、权限验证等,这样就把业务代码与系统代码分开,同时减少了A和B之间的耦合。
    动态代理的经典应用是Spring AOP。有兴趣可以学学。


    AOP中使用的cglib

    hello.java 被代理对象

    
    package org.smart4j.framework.test;
     
    /**
     * Created by jack on 2017/6/27.
     */
    public interface Hello {
        void sayHello(String name);
    }
    
    

    HelloImp.java

    package org.smart4j.framework.test;
    
    /**
     * Created by liangboqun on 2017/6/27.
     */
    public class HelloImp implements Hello {
        public void sayHello(String name) {
            System.out.println("Hello ! " + name);
        }
    }
    
    

    DynamicProxy.java 动态代理类

    package org.smart4j.framework.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class DynamicProxy implements InvocationHandler {
        private Object target;
    
        public DynamicProxy(Object target) {
            this.target = target;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before();
            Object result = method.invoke(target, args);
            after();
            return result;
        }
    
        private void after() {
            System.out.println("proxy after");
        }
    
        private void before() {
            System.out.println("proxy before");
        }
        public <T> T getProxy(){
            return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
        }
    
    }
    
    

    测试类:

    package org.smart4j.framework.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * Created by fumc on 2017/6/27.
     */
    public class MainTest1 {
        public static void main(String[] args) {
            System.out.println("================");
            System.out.println("====动态代理====");
            Hello helloDynamic =new HelloImp();
            DynamicProxy dynamicProxy=new DynamicProxy(helloDynamic);
            Hello hello = (Hello)Proxy.newProxyInstance(helloDynamic.getClass().getClassLoader(), helloDynamic.getClass().getInterfaces(), dynamicProxy);
            hello.sayHello("付萌好");
            helloDynamic.sayHello("mc good");
            System.out.println("====动态代理====");
    
    
        }
    }
    
    

    返回结果

    ================
    ====动态代理====
    proxy before
    Hello ! 付萌好
    proxy after
    Hello ! mc good
    ====动态代理====
    

    相关文章

      网友评论

          本文标题:java中的动态代理

          本文链接:https://www.haomeiwen.com/subject/hnbszftx.html