美文网首页
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