所谓的动态代理,他是一个代理机制,代理机制能够看做是对调用目标的一个包装,这样咱们对目标代码的调用不是直接发生的,而是经过代理完成,经过代理能够有效的让调用者和实现者之间解耦,常见的代理模式包括:JDK Proxy、cglib。java
下面能够看看JDK动态代理的一个简单的例子,下面只是加了一句print,在生产系统中,咱们能够轻松扩展相似逻辑进行诊断、限流等。ide
public interface Hello{ void sayHello(); }
public class HelloImpl implements Hello { @Override public void sayHello() { System.out.println("Hello JDK Dynamic Proxy!!!"); } }
public class DynamicProxyMain { public static void main(String[] args) { HelloImpl hello = new HelloImpl(); JDKDynamicProxy handler = new JDKDynamicProxy(hello); //构造代码实例 Hello proxyHello = new JDKDynamicProxy(new HelloImpl()).getProxy(); //使用代理对象调用代理方法 proxyHello.sayHello(); } /** * 建立一个代理类JDKDynamicProxy实现java.lang.reflect.InvocationHandler接口,重写invoke方法 */ static class JDKDynamicProxy implements InvocationHandler{ private Object target; public JDKDynamicProxy(Object target) { this.target = target; } /** * 获取被代理接口实例对象 * @param <T> * @return */ public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("正在代理sayHello方法......"); Object result = method.invoke(target, args); return result; } } }
运行main函数,结果以下:函数
正在代理sayHello方法...... Hello JDK Dynamic Proxy!!!