java代理 jdk動態代理應用案列

來源:互聯網
上載者:User

java代理有jdk動態代理、cglib代理,這裡只說下jdk動態代理,jdk動態代理主要使用的是java反射機制(既java.lang.reflect包)
原理是(歌手、經紀人做例子):
建立一個公用的介面,比如:歌手public interface Singer;
用具體的類實現介面,比如:周杰倫,他是歌手所以實現Singer這個類,class MySinger implements Singer
建立代理類,這裡也就是經紀人,他需要實現InvocationHandler類,並重寫invoke方法
這樣當有什麼事情,要找周杰倫(具體類)的時候,就必須先到經紀人(代理類)那裡處理,代理人在決定要不要與你見面(該方法要不要執行)
1、歌手介面 複製代碼 代碼如下:public interface Singer {

public abstract void sing();

public abstract String s();
}

2、具體的歌手 複製代碼 代碼如下:public class MySinger implements Singer {
public void sing() {
// TODO Auto-generated method stub
System.err.println("唱歌。。。。");
}
}

3、代理類(經紀人) 複製代碼 代碼如下:public class agent implements InvocationHandler{
public Object target;

//綁定
public Object bind(Object target){
this.target=target;
//必須放回Proxy
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

//重新
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object o =null;
System.out.println("開始事務");
System.out.println("判斷許可權");

o = method.invoke(target, args);//執行方法

System.out.println("結束事務");
return o;
}
}

4、測試(為什麼要間介面能,下面你會發現代理返回的是他們的介面類,這要一個代理類,就可以代理多個類,只要該類是同個一個介面的是實現) 複製代碼 代碼如下:public class Test {
public static void main(String[] args) {
//
agent a =new agent();
Singer s= (Singer) a.bind(new MySinger());
s.sing();
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.