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