在 Java 開發中,將類別放置於預設包(default package)雖然方便快速測試,但自 Java 1.4 起,編譯器不再允許其他具名包直接引用預設包中的類別。這篇文章將說明為什麼會出現這個限制,並示範如何使用 Java 反射機制作為替代方案來實現跨包存取。
許多初學者習慣在未指定 package 的情況下編寫類別,這類類別屬於「預設包」。然而,當專案結構變得複雜,需要在不同包之間互相呼叫時,若嘗試從具名包(如 com.example.test)中 import 預設包的類別,編譯器會報錯:
error: package <default> does not exist
雖然不建議在生產環境大量使用,但若必須臨時相容舊代碼,可透過 Class.forName() 動態載入預設包類別:
// 假設預設包有一個名為 Statistics 的類別
try {
// 完整類別名稱(預設包無包名,直接用類別名)
Class> clazz = Class.forName("Statistics");
// 建立實例
Object instance = clazz.getDeclaredConstructor().newInstance();
// 呼叫方法
Method method = clazz.getMethod("calculate", double[].class);
double result = (double) method.invoke(instance, (Object) new double[]{1.0, 2.0, 3.0});
System.out.println("計算結果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
com.company.module)。import 即可徹底解決。
Java 1.4 後禁止跨包引用預設包類別,是為了強化封裝與模組化。若遇到舊代碼相容需求,可暫時使用反射機制繞過限制,但長期應規劃重構,將所有類別納入具名包管理,確保專案結構清晰、可維護。