所謂的動態代理,他是一個代理機制,代理機制能夠看做是對調用目標的一個包裝,這樣咱們對目標代碼的調用不是直接發生的,而是經過代理完成,經過代理能夠有效的讓調用者和實現者之間解耦,常見的代理模式包括: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!!!