|
這是我學習中的一些體會的總結,希望大家提意見指正,同時也希望能給對這個問題感興趣的朋友一些幫助。
java中至少有三種方式可以生成一個對象,new,Class.ForName(String className)和ClassLoader.loadClass(String name)。讓我們來分析和比較他們。
1,用關鍵字new生成對象:這是最常用的一種方式,例如 new String("hello")用new生成對象的特點是,這個對象的類必須在編譯時就在classpath中,如果沒有特別的理由和要求,這是我們生成一個對象的第一選擇;
2,Class.forName(String className)。例如Class c = Class.forName("com.company.jdbc.Driver");這種方法的特點是在編譯的時候不需要包含這個類在classpath中,而可以推遲到運行時再到claspath中找。這種方式的典型運用時加載JDBC驅動程序的時候。因爲不同的數據庫有不同的JDBC驅動程序,所以對於需要得到某種數據庫連接的應用程序,可能需要到運行時才知道連接的是哪種數據庫,所以採用這種方式加載數據庫驅動程序。而且這用有利於編寫通用數據庫的連接池程序,因爲一個數據庫的連接池並不需要在編譯時就需要各種數據庫的驅動程序的類;
3,ClassLoader.loadClass(String name);這種方式更加靈活,它不僅可以從classpath中加載類,而且也可以在運行時通過自定義一個ClassLoader來加載類。例如可以從某個http或者ftp服務器加載類,更可以從任意的byte[]來加載類。如果我們寫一個自己的類加載器MyClassLoader extends ClassLoader,那麼我們可以通過重載父類中的protected Class findClass(String name)方法來讓它具有我們期待的行爲,ClassLoader的loadClass方法會調用findClass來的到一個Class類型的對象,而findClass可以通過調用Class defineClass(String name, byte[] b, int off, int len)來通過byte[]構造一個Class類型的對象。這種方式的特點是即使載運行時也不需要這個類在classpath中。