用到的類:Proxy(由jdk提供)
用到的方法:newProxyInstance()
實現接口的動態代理前提:被代理的類至少實現一個接口,如果沒有則不能使用接口的動態代理
/**
* 對手機商要求的接口
*/
public interface IProducer {
/**
* 賣手機
* @param money
*/
public void saleProduct(float money);
/**
* 產品售後
* @param money
*/
public void afterService(float money);
}
/**
* 生產者
*/
public class Producer implements IProducer {
/**
* 賣手機
* @param money
*/
public void saleProduct(float money){
System.out.println("賣手機,拿到錢"+money);
}
/**
* 產品售後
* @param money
*/
public void afterService(float money){
System.out.println("產品售後,拿到錢"+money);
}
}
public class Client {
public static void main(String[] args) {
final Producer producer = new Producer();
/**
* 基於接口的動態代理
* newProxyInstance方法的參數
* classLoader:類加載器
* 它是用於加載代理對象字節碼的。
* class[]:字節碼數組
* 它是用於讓代理對象和被代理對象有相同方法
* InvocationHandler:提供增強的代碼
*
*/
IProducer proxyInstance =(IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
producer.getClass().getInterfaces(),
new InvocationHandler() {
/**
* 作用:執行被代理對象的任何接口方法都會經過該方法
* @param proxy 代理對象的引用
* @param method 當前執行的方法
* @param args 當前執行方法所需的參數
* @return 和被代理對象方法有相同的返回值
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//提供增強的代碼
Object returnValue=null;
//獲取方法執行的參數
Float money=(Float)args[0];
//判斷當前方法是不是銷售
if("saleProduct".equals(method.getName())){
returnValue=method.invoke(producer,money*0.8f);
}
return returnValue;
//return method.invoke(producer,args);
}
});
proxyInstance.saleProduct(5000f);
}
}