我们定义一个接口,并且使用代理模式,想要做到的就是在调用这个接口的实现类时在此方法上添加功能。
public interface HelloInterface { void sayHello(); }
接下来就是这个接口的实现类,我们在调用sayHello时输出一句话:
public class Hello implements HelloInterface{ @Override public void sayHello() { System.out.println("hello world"); } }
然后我们设计代理类:
/** * 静态代理 */ public class StaticHelloProxy implements HelloInterface{ private HelloInterface helloInterface = new Hello(); @Override public void sayHello() { System.out.println("say hello before invoke"); helloInterface.sayHello(); System.out.println("say hello after invoke"); } }
这样我们就实现了静态代理,StaticHelloProxy这个类去代理Hello类。并且给方法扩展了功能。
我们在刚刚的静态代理中发现了一个问题,StaticHelloProxy这个代理只能代理Hello这个类,如果有其他的类需要代理,我们就需要更多的代理类,这不是我们想要的。那么能不能在同一个类中代理更多的类呢?实际上通过反射是可以做到的。
public class ProxyHandle implements InvocationHandler { private Object object; public ProxyHandle(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("say hello before invoke" + method.getName()); method.invoke(object, args); System.out.println("say hello after invoke" + method.getName()); return null; } }
我们定义了一个ProxyHandle,在构造方法中将需要的对象传入,并且通过反射调用方法。当然调用也不太一样。
public static void main(String[] args) { HelloInterface helloInterface = new Hello(); InvocationHandler handler = new ProxyHandle(helloInterface); HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(helloInterface.getClass().getClassLoader(),helloInterface.getClass().getInterfaces(),handler); proxyHello.sayHello(); }
这样子就实现了动态代理。