1.文件結構
2. Rent.java 接口
package com.wyyblog.dynamicProxy;
public interface Rent {
public void rent();
}
3. ProxyInvocationHandler.java 動態代理類
package com.wyyblog.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Object object;
public void setRent(Object object) {
this.object = object;
}
/**
* 生成代理類
*/
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
/**
* proxy 是代理類
* method 是代理類調用處理程序 的方法對象
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(object, args);
return result;
}
/**
* 擴展日誌方法
* @param methodName方法名
* 可以自定義其他的方法進行擴展
*/
private void log(String methodName) {
System.out.println("執行"+ methodName+"方法");
}
}
4. Host.java 實現類
package com.wyyblog.dynamicProxy;
public class Host implements Rent{
public void rent() {
System.out.println("租房子");
}
}
5. Client.java 測試類
package com.wyyblog.dynamicProxy;
public class Client {
public static void main(String[] args) {
Host host = new Host();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host);
Rent proxy = (Rent)pih.getProxy();
proxy.rent();
}
}
6. 總結:
一個動態代理一般代理某一類業務,一個動態代理可以代理各種接口(類)。