Java中的動態代理

建立接口

// 建立一個接口,名字叫Resource
public interface Resource {
    public void operationA();
    public void operationB();
}

實現接口

// Resource接口的實現
public class ConcreateResource implements Resource{
    public ConcreateResource() {
        System.out.println("建立了一個ConcreateResource的對象");
    }

    @Override
    public void operationA() {
        System.out.println("Operaation A");
    }
    @Override
    public void operationB() {
        System.out.println("Operation B");
    }
}

實現代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {

    private Resource resource;
    public DynamicProxy() {
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在方法調用時建立對象
        if(resource==null){
            resource = new ConcreateResource();
            System.out.println("初始化");
        }
        if (method.getName().equals("operationA")) {
            System.out.println("OperationA in Proxy");
        }
        return method.invoke(resource, args);//執行方法;
    }

    //建立一個綁定了該代理對象的虛擬的Resource,此時並未建立實際的對象
    public Resource create() {
        Resource resource = null;
        resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[] { Resource.class },
                this);//綁定
        return resource;
    }
}

測試

package test0107;

import java.lang.reflect.Proxy;

public class TestProxy {
    public static void main(String[] args) {
    
        //第一種測試,使用Create方法建立resource對象,在調用時建立該對象的實例
        DynamicProxy dynamicProxy = new DynamicProxy();
        Resource resource = dynamicProxy.create();//綁定,此時對象沒有建立
        System.out.println("此時對象未建立");
        resource.operationA();
        resource.operationB();
        
        Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在測試類中綁定
        resource2.operationA();
        resource2.operationB();
    }

}
/*
結果以下:
此時對象未建立
建立了一個ConcreateResource的對象
初始化
OperationA in Proxy
Operaation A
Operation B
OperationA in Proxy
Operaation A
Operation B
*/

分析:

  1. 先輸出「此時對象未建立」說明在使用代理綁定Resource對象的時候並無建立該對象的實例,只是返回了一個能夠調用的接口java

  2. 輸出「建立了一個ConcreateResource的對象」和「初始化」說明在調用方法的時候建立了該對象的實例ide

  3. 接下來的輸出即說明綁定了代理的對象在每一次調用方法的時候都是在執行綁定的代理實例的invoke方法,如此,代理模式就完成了。測試

經過這種動態代理,能夠實如今調用某些方法前實現咱們想要的操做。this

相關文章
相關標籤/搜索