1. 程式人生 > >Java設計模式Proxy之動態代理

Java設計模式Proxy之動態代理

Java動態代理主要涉及到兩個類:

  • InvocationHandler:該介面中僅定義了一個Object : invoke(Object proxy, Method method, Object[] args);引數proxy指代理類,method表示被代理的方法,args為method中的引數陣列,返回值Object為代理例項的方法呼叫返回的值。這個抽象方法在代理類中動態實現。
  • Proxy:所有動態代理類的父類,提供用於建立動態代理類和例項的靜態方法。

所謂動態代理類是在執行時生成的class,在生成它時,你必須提供一組interface給它,則動態代理類就宣稱它實現了這些interface。當然,動態代理類就充當一個代理,你不要企圖它會幫你幹實質性的工作,在生成它的例項時你必須提供一個handler,由它接管實際的工作。

下面通過例項來說明:

Subject.java

/**
 * 抽象角色:宣告真實物件和代理物件的共同介面
 * @author WalkingDog
 *
 */
public interface Subject {
	public void doSomething();
}

RealSubject.java
 * 真實物件:定義目標操作
 * @author WalkingDog
 *
 */
public class RealSubject implements Subject {
	@Override
	public void doSomething() {
		System.out.println("RealSubject.doSomething");
	}
}

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

public class DynamicProxy implements InvocationHandler {
	private Object object;
	public DynamicProxy(Object object) {
		this.object = object;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("Before Invoke ! method : " + method);
		
		//我們可以再代理方法呼叫前後新增功能
		Object result = method.invoke(object, args);
		
		System.out.println("object : " + object + "\tresult : " + result + "\targs : " + args);
		System.out.println("After Invoke !");
		return result;
	}
}

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

/**
 * 客戶端
 * @author WalkingDog
 *
 */
public class Client {
	public static void main(String[] args) throws Exception {
		
		//建立目標物件,也就是被代理物件
		RealSubject realSubject = new RealSubject();
		
		//將目標物件交給代理
		InvocationHandler handler = new DynamicProxy(realSubject);
		
//		Class<?> proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()
//				, new Class[]{Subject.class});
//		Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})
//				.newInstance(new Object[]{handler});
		
		//返回代理物件,相當於上面兩句
		Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
				realSubject.getClass().getInterfaces(),
				handler);
		
		//叫代理物件去doSomething(),其實在代理物件中的doSomething()中還是會
		//用handler來呼叫invoke(proxy, method, args) 引數proxy為呼叫者subject(this),
		//method為doSomething(),引數為方法要傳入的引數,這裡沒有
		subject.doSomething();
	}
}

列印結果:
Before Invoke ! method : public abstract void Subject.doSomething()
RealSubject.doSomething
object : [email protected]    result : null    args : null
After Invoke !


相關推薦

Java設計模式Proxy動態代理

Java動態代理主要涉及到兩個類: InvocationHandler:該介面中僅定義了一個Object : invoke(Object proxy, Method method, Object[] args);引數proxy指代理類,method表示被代理的方法,args

【八】Java設計模式GOF23動態代理(原生JDK和CGLIB)

一、使用JDK原生動態代理 基於Java反射機制。 Java動態代理是基於介面的,如果物件沒有實現介面則選擇用CGLIB方式實現動態代理。 實現步驟: 1.首先實現一個InvocationHandler,方法呼叫會被轉發到該類的invoke()方法。 2.然後在需要

設計模式學習動態代理模式

import java.lang.reflect.Method; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; class InvocationHandlerImpl implements I

java設計模式 代理Proxy模式

代理模式的核心作用就是通過代理,控制對物件的訪問。這跟實際中是一樣的,比如說明星都有經紀人,這就是一個代理,比如有人要找某明星拍戲,那麼首先處理這事的是他的經紀人,雖然拍戲需要自己拍,但是拍戲前後的一些必須要做的事等等,都由這個經紀人來處理。    在程式中也是如此,通過

Java基礎加強總結動態代理(Proxy)

一、代理的概念 動態代理技術是整個java技術中最重要的一個技術,它是學習java框架的基礎,不會動態代理技術,那麼在學習Spring這些框架時是學不明白的。   動態代理技術就是用來產生一個物件的代理物件的。在開發中為什麼需要為一個物件產生代理物件呢?   舉一個現實生活中

原始碼專題spring設計模式:jdk動態代理

jdk動態代理 程式碼實現  滿足代理模式應用場景的三個必要條件 兩個角色:執行者、被代理物件 注重過程,必須要做,被代理物件沒時間做或者不想做(怕羞羞),不專業 執行者必須拿到被代理物件的個人資料(執行者持有被代理物件的引用) jdk的動態代理通過呼叫Proxy.n

Java設計模式裝飾模式

情況 -s 抽象接口 output 就會 ati ack hba ensure 裝飾模式(Decorator) 1. 裝飾模式(Decorator)的定義:又名包裝(Wrapper)模式。裝飾模式以對client透明的方式擴展對象的功能,是繼承關系的一個替代方案。

java設計模式系列設計模式概要(1)

而不是 行為型模式 一句話 創建 rom 多次 ati 代理模式 之間 一、什麽是設計模式   設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

java反射機制應用動態代理

代理類 過多 size bject interface 並且 編譯期 代理 抽象 1.靜態代理類和動態代理類區別 靜態代理:要求被代理類和代理類同時實現相應的一套接口;通過代理類的對象調用重寫接口的方法時,實際上執行的是被代理類的同樣的 方法的調用。 動態代理:在程序運

Java設計模式2七大設計模式

一.開閉原則 一個軟體實體如類,模組和函式應該對拓展開放,對修改關閉。 用抽象構建框架,用實現拓展細節。 優點:提高軟體系統的可複用性和可維護性。 為了滿足開閉原則,需要對系統進行抽象化設計,抽象化是開閉原則的關鍵。在Java、C#等程式語言中,可以為系統定義一

Java設計模式1UML

UML定義 統一建模語言 UML展現了一系列最佳工程實踐 這些最佳實踐在對大規模,複雜系統進行建模方面,特別是在軟體架構層次已經被證實有效。 UML分類 結構式圖形 行為式圖形 互動式圖形 結構式圖形 靜態圖(類圖,物件圖,包圖)

JAVA設計模式總結23種設計模式

ret 都對 松耦合 mem ava htm 初學者 並不是 不用 一、什麽是設計模式

java設計模式---(3)代理模式

代理模式就是這個事情是A的,A自己不做就B去代他做。代理模式分2種情況:簡單的靜態代理和稍微複雜的動態代理。 靜態代理 例項: 有個老師: public class Teacher { public void teach(String teach) { Sys

java 設計模式01簡單工廠和抽象工廠模式

總結一下: 簡單工廠:工廠根據條件去建立對應的具體實現物件,如果需要增加新的物件,就必須修改建立物件的介面,增加判斷條件,另外可能建立的物件下面的方法也可能有其他物件去實現相同的功能,造成混亂,比如,amd可以造cpu,也可以造網絡卡,不能建立了一個amd造cpu的

【十】Java設計模式GOF23介面卡模式(類方式實現、物件方式實現)

目錄 Target.java package com.bjsxt.adapter; /** * @author liyijie * @date 2016年8月12日下午4:13:21 *

設計模式筆記代理模式

代理模式 為什麼需要代理模式 當我們需要訪問外部資源的時候,由於我們自己網路限制,我們不能夠訪問到外部資源,但是如果有一個主機,可以我們訪問外部的資源,然後將外部資源存放到儲存裝置上,然後我們可以訪問這個儲存裝置來獲取我們想要的資源。在這裡這個主機扮演者代理的角色,幫助我

java設計模式大話工廠方法模式

    由於簡單工廠模式中工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。 當

java設計模式 單例(Singleton)模式

1. 單例模式的定義         單例模式(Singleton Pattern)是一個比較簡單的模式,其原始定義如下:Ensure a class has only one instance, and provide a global point of access

java設計模式 模板方法(Template Method)模式

1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基本功能即可,不考慮擴充套件性,那你會怎麼做呢?我們首先會根據經驗設計一個類圖:        由這個類圖可知,非

java設計模式 責任鏈(chain of resposibility)模式

  責任鏈模式,顧名思義,就是一條鏈。這個鏈到底是怎麼執行的呢?它主要是將能夠處理同一類請求的物件連成一條鏈,所提交的請求沿著鏈傳遞,鏈上的物件逐個判斷是否有能力處理該請求,如果能則處理,如果不能則