真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JAVA的動(dòng)態(tài)代理機(jī)制

前文講解了代理的基本概念和靜態(tài)代理機(jī)制:       設(shè)計(jì)模式之代理模式               

成都創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比寧夏網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式寧夏網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋寧夏地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴(lài)。

現(xiàn)在來(lái)談?wù)凧AVA的動(dòng)態(tài)代理機(jī)制

在java的動(dòng)態(tài)代理機(jī)制中有一個(gè)重要的接口invocationhandler和一個(gè)重要的類(lèi)Proxy,讓我們查看一下官方文檔:

InvocationHandler is the interface implemented by the invocation handler of a proxy instance.

Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, 
the method invocation is encoded and dispatched to the invoke method of its invocation handler.

代理實(shí)例的調(diào)用處理程序需要實(shí)現(xiàn)InvocationHandler接口.

每個(gè)代理實(shí)例都關(guān)聯(lián)了一個(gè)調(diào)用處理程序.當(dāng)一個(gè)方法被代理實(shí)例調(diào)用時(shí),這個(gè)方法的調(diào)用就會(huì)被加密并分發(fā)到調(diào)用程序的調(diào)用方法上.

翻譯的很拗口,沒(méi)關(guān)系,代會(huì)看代碼的執(zhí)行流程就明白了.

這個(gè)調(diào)用處理程序有一個(gè)調(diào)用方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

處理代理對(duì)象的調(diào)用方法并返回結(jié)果 .當(dāng)代理對(duì)象綁定的調(diào)用程序被調(diào)用時(shí),這個(gè)方法就會(huì)被調(diào)用程序調(diào)用.

proxy 被調(diào)用方法的代理對(duì)象

method 代理對(duì)象調(diào)用接口方法的相應(yīng)方法.

args 通過(guò)代理對(duì)象接口調(diào)用方法傳入的對(duì)象數(shù)組.接口方法沒(méi)有參數(shù)則為空.

下面來(lái)看看proxy的文檔描述:

public class Proxy extends Object implements Serializable
Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.

Proxy 提供靜態(tài)方法創(chuàng)建動(dòng)態(tài)代理了類(lèi)和對(duì)象,同時(shí)也是這些方法創(chuàng)建代理對(duì)象的超類(lèi).

動(dòng)態(tài)代理類(lèi)是一個(gè)在運(yùn)行時(shí)實(shí)現(xiàn)了一系列指定接口的方法的類(lèi).代理方法實(shí)現(xiàn)代理接口,代理類(lèi)創(chuàng)建代理對(duì)象,每個(gè)代理類(lèi)都關(guān)聯(lián)了一個(gè)實(shí)現(xiàn)了InvocationcationHandler接口的調(diào)用程序.代理對(duì)象的調(diào)用方法通過(guò)他的代理接口,被分發(fā)到實(shí)例調(diào)用程序的invoke方法上.通過(guò)反射機(jī)制,這個(gè)指定的方法就被調(diào)用了,并且傳入一個(gè)對(duì)象數(shù)組.

  • Proxy的一些properties:

  • Proxy類(lèi)是public,final,和非抽象的

  • 代理類(lèi)無(wú)需指定合法的名稱(chēng),類(lèi)名會(huì)以"$Proxy"開(kāi)頭

  • 代理類(lèi)需要繼承Proxy

  • 代理類(lèi)需要按順序?qū)崿F(xiàn)創(chuàng)建時(shí)指定的各個(gè)接口

  • 如果代理類(lèi)實(shí)現(xiàn)的是非公共接口,那么它需要被定義在接口的同名包下.

  • 由于代理類(lèi)在創(chuàng)建時(shí)實(shí)現(xiàn)了指定的所有接口,所以在類(lèi)對(duì)象上調(diào)用getInterfaces,將會(huì)返回一個(gè)接口列表的數(shù)組,調(diào)用getMetjods,將會(huì)返回實(shí)現(xiàn)所有接口方法的數(shù)組.調(diào)用getMethod將會(huì)返回proxy預(yù)期的方法.

  • Proxy.isProxyClass 判斷是不是代理方法

  • 代理類(lèi)的java.security.ProtectionDomain,和系統(tǒng)類(lèi)一樣在被啟動(dòng)類(lèi)加載

  • 每一個(gè)代理類(lèi)都有一個(gè)帶慘構(gòu)造方法,實(shí)現(xiàn)InvocationHandler接口,并綁定調(diào)用程序到代理對(duì)象上.相比通過(guò)反射機(jī)制去獲取構(gòu)造方法,代理對(duì)象可以通過(guò)調(diào)用Proxy.newProxyInstance方法來(lái)構(gòu)造代理對(duì)象.

代理接口的properties

  • 代理類(lèi)實(shí)現(xiàn)代理接口

  • 每一個(gè)代理實(shí)例都通過(guò)構(gòu)造方法關(guān)聯(lián)了一個(gè)調(diào)用程序.靜態(tài)方法Proxy.getInvocationHandler將會(huì)返回一個(gè)由代理對(duì)象指定的調(diào)用程序

  • 代理對(duì)象的接口方法調(diào)用將會(huì)被加密和分發(fā)到調(diào)用處理程序的invoke方法上.

  • hasCode,equals,toString等方法的調(diào)用都會(huì)被加密和分發(fā)到調(diào)用程序的invoke方法,接口方法也被同樣的加密和分發(fā).

話(huà)不多說(shuō),代碼奉上:

首先定義一個(gè)接口:

package com.shadow.proxy.dynamicproxy;

/**
 *
 * @author sunny
 */
public interface ITask {
    public void setData(String data);
    public int getCalData(int x);
}

定義一個(gè)實(shí)現(xiàn)接口業(yè)務(wù)的真實(shí)主題:

package com.shadow.proxy.dynamicproxy;

/**
 *
 * @author sunny
 */
public class TaskImpl implements ITask {

    @Override
    public void setData(String data) {
        System.out.println(data + "data is saved");
    }

    @Override
    public int getCalData(int x) {
        return x * 10;
    }
    
}

最關(guān)鍵的最核心的定義代理類(lèi):

package com.shadow.proxy.dynamicproxy;

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

/**
 *
 * @author sunny
 */
public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result;
        System.out.println("開(kāi)始執(zhí)行方法:" + method);
        result = method.invoke(obj, args);
        System.out.println(method + "方法執(zhí)行結(jié)束");
        return result;
    }
    
}

編寫(xiě)測(cè)試文件:

package com.shadow.proxy.dynamicproxy;

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

/**
 *
 * @author sunny
 */
public class TestProxy {
    public static void main(String[] args){
        ITask realTask = new TaskImpl();
        InvocationHandler handler = new DynamicProxy(realTask);
        ITask proxyTask = (ITask) Proxy.newProxyInstance(realTask.getClass().getClassLoader(), realTask.getClass().getInterfaces(), handler);
        proxyTask.setData("來(lái)一個(gè)漢堡");
        System.out.println(proxyTask.getCalData(10));
    }
}

文章題目:JAVA的動(dòng)態(tài)代理機(jī)制
本文網(wǎng)址:http://weahome.cn/article/jjpegd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部