標籤:
轉載自部落格: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 :動態代理