Java中的動(dòng)態(tài)代理技術(shù)可以動(dòng)態(tài)的創(chuàng)建并且動(dòng)態(tài)處理對(duì)所代理方法的調(diào)用。在動(dòng)態(tài)代理上所做的所有調(diào)用都會(huì)被重定向到單一的調(diào)用處理器,它的工作是揭示調(diào)用的類型并確定相應(yīng)的策略.
下面是實(shí)現(xiàn)動(dòng)態(tài)代理技術(shù)的步驟:
- 1.編寫(xiě)代理類這個(gè)類實(shí)現(xiàn)InvacationHandler接口
- 2.寫(xiě)一個(gè)公共接口
- 3.編寫(xiě)實(shí)際類實(shí)現(xiàn)這個(gè)公共接口
- 4.使用Proxy.newProxyInstance()靜態(tài)方法得到代理類引用 proxy
1. 寫(xiě)一個(gè)代理類實(shí)現(xiàn)InvacationHandler接口
package com.minglangx.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
*
* @ClassName: MethodSelector
* @Description: 代理器
* @author minglangx
* @date 2017年5月1日 下午3:02:16
*
*/
public class MethodSelector implements InvocationHandler{
private Object proxied;
public MethodSelector(Object proxied) {
this.proxied = proxied;
}
/**
* proxy被代理的對(duì)象
* Method 代理所調(diào)用的方法
* args[] 代理對(duì)象調(diào)用方法中參數(shù)組成的集合
* 該方法實(shí)現(xiàn)對(duì)接口的調(diào)用被重定向?yàn)閷?duì)代理的調(diào)用
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("interesting")) {
System.out.println("Proxy detected the interesting method");
}
return method.invoke(proxied, args);
}
}
2. 寫(xiě)一個(gè)公共接口
package com.minglangx.proxy;
/**
*
* @ClassName: SomeMethods
* @Description: 公共接口方法
* @author minglangx
* @date 2017年5月1日 下午4:26:44
*
*/
public interface SomeMethods {
void boring1();
void boring2();
void interesting(String arg);
void boring3();
}
3.實(shí)現(xiàn)類實(shí)現(xiàn)這個(gè)接口
package com.minglangx.proxy;
/**
* @ClassName: Implementation
* @Description: 實(shí)際對(duì)象類
* @author minglangx
* @date 2017年5月1日 下午3:10:58
*/
public class Implementation implements SomeMethods {
@Override
public void boring1() {
System.out.println("調(diào)用了實(shí)際對(duì)象----boring1");
}
@Override
public void boring3() {
System.out.println("調(diào)用了實(shí)際對(duì)象----boring3");
}
@Override
public void interesting(String arg) {
System.out.println("調(diào)用了實(shí)際對(duì)象的方法interesting輸出--" + arg);
}
@Override
public void boring2() {
System.out.println("調(diào)用了實(shí)際對(duì)象----boring2");
}
}
4.測(cè)試動(dòng)態(tài)代理
package com.minglangx.proxy;
import java.lang.reflect.Proxy;
/**
*
*
* @ClassName: SelectingMethods
*
* @Description: 測(cè)試動(dòng)態(tài)代理類
*
* @author minglangx
*
* @date 2017年5月1日 下午3:14:50
*
*
*
*
*
*/
public class SelectingMethods {
public static void main(String[] args) {
/*
* 這里使用Proxy.newProxyInstance()可以創(chuàng)建動(dòng)態(tài)代理 方法接收3個(gè)參數(shù)
* (一個(gè)類加載器、一個(gè)實(shí)現(xiàn)InvacationHandler接口的實(shí)現(xiàn)類、 實(shí)際對(duì)象的引用
*/
SomeMethods proxy =(SomeMethods) Proxy.newProxyInstance(
SomeMethods.class.getClassLoader(),
new Class[] { SomeMethods.class },
new MethodSelector(new Implementation()));//這里傳入實(shí)際的對(duì)象必須制定傳入?yún)?shù)類型
proxy.boring1();
proxy.boring2();
proxy.interesting("bonbo");
proxy.boring3();
}
}