动态代理,是被代理类不可修改时采取的办法,如果可以修改,就不用这种方法了。
接口类:
package com.hy.lab.dynaproxy; // 接口 public interface Service { void read(); }
实现类:
package com.hy.lab.dynaproxy; // 接口实现 class ServiceImpl implements Service{ @Override public void read() { System.out.println("Real read..."); } }
代理类及运行:
package com.hy.lab.dynaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 代理类 public class Agent implements InvocationHandler { // 被代理人,本例中指ServiceImpl的实例 private Object client; public Agent(Object client){ this.client=client; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before read"); Object result=method.invoke(client,args); System.out.println("After reading"); return result; } public static void main(String[] args){ Service realService=new ServiceImpl(); // 虽然复杂,却是固定写法,可以做一个门面把可变部分对外,不变部分对内 Service proxyService=(Service) Proxy.newProxyInstance(Service.class.getClassLoader(),new Class<?>[]{Service.class},new Agent(realService)); proxyService.read(); } }
效果:
Before read
Real read...
After reading
END