java :動態代理

來源:互聯網
上載者:User

標籤:

轉載自部落格:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

 

獲得類載入器:

1 public static void main(String[] args) {2         Person p1=new Person();3         System.out.println(p1.getClass().getClassLoader().getClass().getName());4     }

輸出:

sun.misc.Launcher$AppClassLoader

 

其實在java中有三種類類載入器。

1)Bootstrap ClassLoader 此載入器採用c++編寫,一般開發中很少見。

2)Extension ClassLoader 用來進行擴充類的載入,一般對應的是jre\lib\ext目錄中的類

3)AppClassLoader 載入classpath指定的類,是最常用的載入器。同時也是java中預設的載入器。

如果想要完成動態代理,首先需要定義一個InvocationHandler介面的子類,已完成代理的具體操作。

 

介面:

1 public interface Subject {2     String  say(String string,int age);3 }

實作類別:

 1 public class RealSubject implements Subject { 2  3     @Override 4     public String say(String string, int age) { 5         // TODO Auto-generated method stub 6         System.out.println("" + string + age); 7         return "well,well,well,well"; 8     } 9 10 }

代理類:

 1 public class MyInvocationHandler implements InvocationHandler { 2     private Object obj; 3  4     public Object bind(Object obj) { 5         this.obj = obj; 6         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj 7                 .getClass().getInterfaces(), this); 8     } 9 10     @Override11     public Object invoke(Object proxy, Method method, Object[] args)12             throws Throwable {13         // TODO Auto-generated method stub14         Object temp = method.invoke(this.obj, args);15         return temp;16     }17 18 }

測試:

1 public static void main(String[] args) {2         MyInvocationHandler handler = new MyInvocationHandler();3         Subject sub= (Subject) handler.bind(new RealSubject());4         String info=sub.say("CC", 21);5         System.out.println(info);6     }

輸出:

CC21
well,well,well,well

 

類的生命週期

在一個類編譯完成之後,下一步就需要開始使用類,如果要使用一個類,肯定離不開JVM。在程式執行中JVM通過裝載,連結,初始化這3個步驟完成。

類的裝載是通過類載入器完成的,載入器將.class檔案的二進位檔案裝入JVM的方法區,並且在堆區建立描述這個類的java.lang.Class對象。用來封裝資料。 但是同一個類只會被類裝載器裝載以前

連結就是把位元據組裝為可以啟動並執行狀態。

 

連結分為校正,準備,解析這3個階段

校正一般用來確認此二進位檔案是否適合當前的JVM(版本),

準備就是為靜態成員分配記憶體空間,。並設定預設值

解析指的是轉換常量池中的代碼作為直接引用的過程,直到所有的符號引用都可以被運行程式使用(建立完整的對應關係)

完成之後,類型也就完成了初始化,初始化之後類的對象就可以正常使用了,直到一個對象不再使用之後,將被記憶體回收。釋放空間。

當沒有任何引用指向Class對象時就會被卸載,結束類的生命週期。

java :動態代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.