Java是一種介於解釋與編繹之間的語言, Java代碼首先編繹成字節碼, 在運行的時候再翻譯成機器碼。 這樣在運行的時候我們就可以通過Java提供的反射方法(reflect)來得到一個Object的Class的額外信息, 靈活性很大,可以簡化很多操作。
Class: 任何一個Object都能通過getClass()這個方法得到它在運行期間的Class。 得到這個Class之後可做的事情就多了, 比如動態得到它的構造函數, 成員變量, 方法等等。 還可以再生成一份新的實例, 下麵隻給出幾個我們常用的方法, 更詳細的用法參照Java API
Ø Class Class.forName(String className) throws ClassNotFoundException: 這是個靜態方法, 通過一個Class的全稱來得到這個Class。
Ø String getName() 取得這個Class的全稱, 包括package名。
Ø Object newInstance() 得到一個實例, 調用缺省的構造函數。
例如我們有一個類: com.some.util.MyClass 如果得到它的一個實例呢? 可能有以下兩種方法:
MyClass myClass = new MyClass(), 直接通過操作符new生成;
或者:
MyClass myClass = (MyClass) Class.forName(“com.some.util.MyClass”).newInstance();
也許有人就會懷疑第二種方法實際意義, 能夠直接new出來乾嘛繞彎。 但實際上它的用處卻很大, 舉個例子: 用過struts的人都知道, 在action-config.xml當中定義了一係列的formBean與actionBean, 當然每個form與action都具有同類型, 這樣在一個request過來的時候我可以動態的生成一個form與action的實例進行具體的操作, 但在編碼的時候我並不知道具體是何種的form與action, 我隻調用它們父類的方法。 你如果要用第一種方法的話, 你得在編碼的時候通過一個標誌來判斷每一次request需要具體生成的form與action, 代碼的靈活性大大降低。 總的來說在麵向接口的編程當中經常使用這種方法, 比如不同數據庫廠家的JDBC Driver都是從標準的JDBC接口繼承下去的, 我們在寫程序的時候用不著管最終是何種的Driver, 隻有在運行的時候確定。 還有XML的Parser也是, 我們使用的隻是標準的接口, 最後到底是誰來實現它的, 我們用不著去管。
ClassLoader: ClassLoader是一個抽象類,一般的係統有一個缺省的ClassLoader用來裝載Class, 用ClassLoader.getSystemClassLoader()可以得到。不過有時候為了安全或有其它的特殊需要我們可以自定義自己的ClassLoader來進行loader一些我們需要的Class, 比如有的產品它用了自己的ClassLoader可以指定Class隻從它指定的特定的JAR文件裡麵來loader,如果你想通過覆蓋ClassPath方法來想讓它用你的Class是行不通的。 有興趣的可以參照Java API 的更詳細的用法說