把Class.forName()換一種寫法就報錯了!
1?首先,這段代碼沒有任何問題。 public?class?OfficeBetter{ ??????public?static?void?main(String[]?args){ ??????try{ ????????OfficeAble?oa?=(OfficeAble)?Class.forName(args[0]).getConstructor().newInstance(); ????????oa.start(); ??????}catch(Exception?e){ e.printStackTrace(); ??????} ??} }
2 可是,當我不想用
Class.forName(args[0])
來獲取類類型,改成這種寫法就報錯了:
public?class?OfficeBetter{ ??????public?static?void?main(String[]?args){ ??????try{ ????????Class?c=Class.forName(args[0]); ????????Constructor?constructor=c.getConstructor(); ????????OfficeAble?oa=(OfficeAble)constructor.newInstance(); ????????oa.start(); ??????}catch(Exception?e){ e.printStackTrace(); ??????} ??} }
誰能幫我分析一下嗎?編譯報錯:
OfficeBetter.java:5:?error:?cannot?find?symbol ????????Constructor?constructor=c.getConstructor(); ????????^ ??symbol:???class?Constructor ??location:?class?OfficeBetter Note: OfficeBetter.java?uses?unchecked?or?unsafe?operations. Note:?Recompile?with?-Xlint:unchecked?for?details. 1?error
2020-07-13
?本來代碼里面是動態類實現,你Constructor?constructor=c.getConstructor();這行代碼使用了靜態類的實現方式,應該會編譯不過,因為c.getConstructor()無法在靜態編譯期間確定類型。
2020-07-13
正解。多謝你的解答,后面我看書之后,了解了Class.forName("xxx")是動態編譯。當時不懂。下面是我的筆記,