Java動態載入類
一、Class 類
Class.forName("類的全稱")
- 不僅表示類的類型別,還代表了動態載入類
- 請大家區分編譯、執行
- 編譯時刻載入類是靜態載入類、執行時刻載入類是動態載入類
二、靜態載入類
1、我們看下面這段程式碼,通過 new 的方式來建立物件,這其實是靜態方式來載入類(Word和Excel)
- public class Office {
- public static void main(String args[]) {
- if("Word".equals(args[0])) {
- Word w = new Word();
- w.start();
- }
- if("Excel".equals(args[0])) {
- Excel e = new Excel();
- e.start();
- }
- }
- }
如上程式碼,目前是沒有 Word 和 Excel 兩個類,我們編譯程式
結果如下
可見,因為我們沒有 Word 和 Excel 類,自然也沒有 start 方法,報了四個錯誤。
2、我們建立 一個 Word 類
- public class Office {
- public static void main(String args[]) {
- if("Word".equals(args[0])) {
- Word w = new Word();
- w.start();
- }
- if("Excel".equals(args[0])) {
- Excel e = new Excel();
- e.start();
- }
- }
- }
- class Word {
- public void start() {
- System.out.println("start word...");
- }
- }
再次編譯,結果如下
這次只報了兩個錯誤了,顯示 Excel 類和其物件的 start() 方法不存在
3、結論
使用 new 建立物件的方式,是靜態載入類,編譯階段,就會載入可能要用到類,如果不存在就報錯,無法通過編譯。
如上,第2中的例子,Word 類存在,Excel 不存在,導致 Word 類也用不了。
我們當然希望,Word 類存在 Word 就能用,用 Excel 的時候發現 Excel 類不存在再報錯吧。
如果將來我們有100個功能,有一個功能有問題,其他99個也用不了,十分不好。
這就是編譯時載入導致的,靜態載入類。
我們希望,用的時候再載入類,不用不載入,動態載入類可以實現。
三、使用動態載入的方式
1、 OfficeAble.java 定義規範的介面
- public interface OfficeAble {
- void start();
- }
2、Word.java 實現 OfficeAble 介面
- public class Word implements OfficeAble {
- public void start() {
- System.out.println("start word...");
- }
- }
3、Excel.java 實現 OfficeAble 介面
- public class Excel implements OfficeAble {
- @Override
- public void start() {
- System.out.println("start excel...");
- }
- }
4、OfficeBetter.java
- public class OfficeBetter {
- public static void main(String args[]) {
- try {
- //動態載入類,在執行的時候載入類
- Class c = Class.forName(args[0]);
- //通過類型別
- OfficeAble oa = (OfficeAble) c.newInstance();
- oa.start();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- }
- }
然後我們在終端依次編譯 Word類,Excel 類,OfficeBetter類
再執行 Office類,帶 Word 引數
再執行 OfficeBtter類,帶 Excel 引數
同時,已經編譯的,生成了.class 檔案,下次就可以直接執行了,而不需要重新編譯,這就是所謂的“一次編譯,到處執行”。
一般情況,軟體升級也是如此,只需要編譯需要新的功能,而之前的功能也可以正常使用。
相關文章
- 透過現象看本質:Java類動態載入和熱替換Java
- DLL動態庫動態載入
- Java jvm 類載入 反射JavaJVM反射
- java類載入機制Java
- 動態載入UserControl
- 動態獲取一級分類下拉框,根據所選一級分類id動態載入二級分類載入至下拉框
- C# 動態載入元件類庫,支援熱插拔元件C#元件
- php 自動類載入類 composer.json 實現自動載入PHPJSON
- Java類載入器詳解Java
- java類的載入過程Java
- Java父子類載入順序Java
- Java-JVM-類載入器JavaJVM
- 一個Java類的載入Java
- python動態載入(三)Python
- vue 動態載入元件Vue元件
- goloader - golang動態載入Golang
- QLibrary 載入動態庫
- Java基礎-類載入器以及載入機制Java
- Java基礎篇—Java類載入機制Java
- Java類載入知識總結Java
- Java類載入原始碼閱讀Java原始碼
- 07.Java類載入問題Java
- Java類載入機制總結Java
- 談談 Java 類載入機制Java
- ListView動態載入資料View
- 指令碼的動態載入指令碼
- 使用dlopen載入動態庫
- Java類載入機制-雙親委派Java
- 關於java中的類載入器Java
- Java 技術之類載入機制Java
- 【JAVA】自定義類載入器實現類隔離Java
- echarts遷移圖動態載入Echarts
- OrchardCore 如何動態載入模組?
- JVM效能最佳化 —— 類載入器,手動實現類的熱載入JVM
- Flutter 基類BaseWidget封裝(錯誤態、載入態、無資料態)Flutter封裝
- Java類載入機制詳解【java面試題】Java面試題
- 類載入
- Java 類載入之匿名類和主類相互依賴問題Java