在目前的Java開發包中包含了對動態代理的支持
Proxy 類主要用來獲取動態代理對象
Protected Proxy(InvocationHandler h)
Static Class getProxyClass (ClassLoader loader
Static Object newProxyInstance(ClassLoader loader
InvocationHandler 接口用來約束調用者實現
該接口中僅定義了一個方法 Object: invoke(Object obj
所謂Dynamic Proxy是這樣一種class:它是在運行時生成的class
我做了個小例子
Java代碼
package com
/**
* 業務接口
* @author why
*
*/
public interface HelloWorld {
public void sayHello();
public String sayHelloWithReturnValue();
}
package com
/**
* 業務接口
* @author why
*
*/
public interface HelloWorld {
public void sayHello();
public String sayHelloWithReturnValue();
}
Java代碼
package com
/**
* 業務接口實現類
* @author why
*
*/
public class HelloWorldImpl implements HelloWorld {
public void sayHello() {
System
}
public String sayHelloWithReturnValue() {
String str =
System
return str;
}
}
package com
/**
* 業務接口實現類
* @author why
*
*/
public class HelloWorldImpl implements HelloWorld {
public void sayHello() {
System
}
public String sayHelloWithReturnValue() {
String str =
System
return str;
}
}
假如業務接口和實現類有很多
Java代碼
package com
import java
import java
import java
/**
* 動態代理類
* @author why
*
*/
public class HelloWorldHandler implements InvocationHandler {
//要代理的原始對象
private Object objOriginal;
/**
* 構造函數 (test
* @param obj 要代理的原始對象
*/
public HelloWorldHandler(Object obj) {
this
}
/**
* 無參數構造函數 (test
*
*/
public HelloWorldHandler() {
}
/**
* 返回此代理對象的實例 (test
* @param obj 要代理的原始對象
* @return
*/
public Object newProxy(Object obj) {
this
return Proxy
}
public Object invoke(Object proxy
Object result;
//方法調用之前
doBefore();
//調用原始對象的方法
result = method
//方法調用之後
doAfter();
return result;
}
private void doBefore() {
System
}
private void doAfter() {
System
}
}
package com
import java
import java
import java
/**
* 動態代理類
* @author why
*
*/
public class HelloWorldHandler implements InvocationHandler {
//要代理的原始對象
private Object objOriginal;
/**
* 構造函數 (test
* @param obj 要代理的原始對象
*/
public HelloWorldHandler(Object obj) {
this
}
/**
* 無參數構造函數 (test
*
*/
public HelloWorldHandler() {
}
/**
* 返回此代理對象的實例 (test
* @param obj 要代理的原始對象
* @return
*/
public Object newProxy(Object obj) {
this
return Proxy
}
public Object invoke(Object proxy
Object result;
//方法調用之前
doBefore();
//調用原始對象的方法
result = method
//方法調用之後
doAfter();
return result;
}
private void doBefore() {
System
}
private void doAfter() {
System
}
}
我寫了兩種獲取動態代理對象實例的方法
Java代碼
package com
import java
import java
public class Test {
/**
* JAVA 動態代理
* @param args
*/
public static void main(String[] args) {
/*
* test
*
* 首先獲取一個業務接口的實現對象
* 獲取一個InvocationHandler實現
* 創建動態代理對象
* 通過動態代理對象調用sayHello()和sayHelloWithReturnValue()方法
*/
HelloWorld hw = new HelloWorldImpl();
InvocationHandler handler
HelloWorld proxy
proxy
String str
System
System
/*
* test
*/
HelloWorldHandler handler
HelloWorld proxy
proxy
String str
System
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25940.html