在面試的時候面試題裏有一道jdk的動態代理是原理,並給一個事例直接寫代碼出來,如今再整理一下java
jdk動態代理主要是想動態在代碼中增長一些功能,不影響現有代碼,實現動態代理須要作以下幾個操做面試
1.首先必需要有一個接口,被代理類必須實現這個接口(必須,緣由是由於生成的代理類也實現這個接口,代理完獲得的類能夠用這個接口類型進接收)eclipse
2.須要寫一個本身的代理處理類,如今給它起個名字叫MyHandler,必須實現InvocationHandler,重寫invoke方法(這個也是必須,咱們要在Invoke(Object proxy, Method method, Object[] args)方法裏面寫本身的邏輯,調用被代理類的方法,invoke(Object proxy, Method method, Object[] args)方法裏面的三個參數的意思爲:代理類,被代理類的哪一個方法,這個方法的參數是什麼)ide
3.MyHandler裏面必須有一個成員變量,類型爲Object,能夠在構造方法的時候將這個成員變量的值賦進去(這個成員變量也是必需要有的,由於在invoke方法裏面須要代理這個類執行這個對象的方法)測試
4.獲得代理對象是經過Proxy類的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法獲得,第一個是獲得classLoader便可,第二個參數爲接口,接口的數量能夠多個,經過代理類能夠獲得:test.getClass().getInterfaces()就獲得了,最後一個參數就是咱們上面第2步裏面本身寫的代理類的實例,這樣就獲得了一個代理類,固然,是第一步定義的接口類型的,而後再調用獲得這個對象,調用方法this
代碼以下,需求是在被代理類的move方法執行先後加打印語句行:spa
定義的接口:代理
public interface Inter { void move(); }
再寫一個被代理類,叫ProxyClazzcode
1 public class ProxyClazz implements Inter{ 2 3 public void move(){ 4 System.out.println("move..."); 5 } 6 7 }
處理代理的類:對象
public class TestProxy implements InvocationHandler{
//被代理類,必須作爲這個類的成員變量 private Object target; public TestProxy(){ super(); }
//經過構造方法傳值進來 public TestProxy(Object target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("start"); //查看proxy類的命名方式:com.sun.proxy.$Proxy0 System.out.println(proxy.getClass().getName()); Object o = method.invoke(target, args); System.out.println("end"); return o; } }
測試用的main方法
public static void main(String[] args) throws Exception, Throwable{ Inter inter = new ProxyClazz(); TestProxy tp = new TestProxy(inter); Inter interProxy =(Inter) Proxy.newProxyInstance(inter.getClass().getClassLoader(), inter.getClass().getInterfaces(), tp); interProxy.move(); }
獲得的結果爲
start
com.sun.proxy.$Proxy0
move...
end
能夠看到確實獲得了代理類:$Proxy0
也知足了咱們的需求,在新生成代理類中加入了咱們想加入的功能