java靜態代理/動態代理

(1)什麼是代理?java

大道理上講代理是一種軟件設計模式,目的地但願能作到代碼重用。具體上講,代理這種設計模式是經過不直接訪問被代理對象的方式,而訪問被代理對象的方法。這個就比如 商戶---->明星經紀人(代理)---->明星這種模式。咱們能夠不經過直接與明星對話的狀況下,而經過明星經紀人(代理)與其產生間接對話spring

(2)什麼狀況下使用代理?設計模式

a. 設計模式中有一個設計原則是開閉原則,是說對修改關閉對擴展開放,咱們在工做中有時會接手不少前人的代碼,裏面代碼邏輯讓人摸不着頭腦(sometimes the code is really like shit),這時就很難去下手修改代碼,那麼這時咱們就能夠經過代理對類進行加強。
b. 咱們在使用RPC框架的時候,框架自己並不能提早知道各個業務方要調用哪些接口的哪些方法 。那麼這個時候,就可用經過動態代理的方式來創建一箇中間人給客戶端使用,也方便框架進行搭建邏輯,某種程度上也是客戶端代碼和框架鬆耦合的一種表現。框架

(3)靜態代理和動態代理
靜態代理比較簡單,主要是多態實現,這裏主要記錄下動態代理ide

定義代理父類測試

package cn.crawler.split.test.proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public interface Father {
    public void rent();

    public void hello(String str);
}

子類this

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class Son implements Father {
    @Override
    public void rent()
    {
        System.out.println("I want to rent my house");
    }

    @Override
    public void hello(String str)
    {
        System.out.println("hello: " + str);
    }
}

代理類設計

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class DynamicProxy implements InvocationHandler
{
    // 這個就是咱們要代理的真實對象
    private Object subject;

    //    構造方法,給咱們要代理的真實對象賦初值
    public DynamicProxy(Object subject)
    {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args)
            throws Throwable
    {
        //  在代理真實對象前咱們能夠添加一些本身的操做
        System.out.println("before rent house");

        System.out.println("Method:" + method);

        //    當代理對象調用真實對象的方法時,其會自動的跳轉到代理對象關聯的handler對象的invoke方法來進行調用
        method.invoke(subject, args);

        //  在代理真實對象後咱們也能夠添加一些本身的操做
        System.out.println("after rent house");

        return null;
    }

}

測試類3d

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class MyProxyTest {
    public static void main (String[] stra){

        //代理對象
        Father son = new Son();
        System.out.println(son.getClass());

        InvocationHandler handler  = new DynamicProxy(son);

        Father father = (Father)Proxy.newProxyInstance(handler.getClass().getClassLoader(), son.getClass().getInterfaces(), handler);
        System.out.println(father.getClass().getName());
        father.rent();
        father.hello("world");


    }
}

測試結果:代理

class cn.crawler.split.test.proxy.Son
org.springframework.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$f4f3d897
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.rent()
I want to rent my house
after rent house
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.hello(java.lang.String)
hello: world
after rent house
相關文章
相關標籤/搜索