java jdk動態代理

在面試的時候面試題裏有一道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

也知足了咱們的需求,在新生成代理類中加入了咱們想加入的功能

相關文章
相關標籤/搜索