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. 总结:
一个动态代理一般代理某一类业务,一个动态代理可以代理各种接口(类)。