關於反射中Class.forName
問題出處:
模板方法中
public static Human createHuman(Class c){
Human human= null ; // 定義一個型別的人類
try {
human = (Human)Class. forName (c.getName()).newInstance(); // 產生一個 人類
} catch (Exception e) {
System. out .println( "必須指定人類的顏色");
}
return human;
}
解釋 1. c.getName() 列印的值是類的完全限定名,即包名+類名
2.Class. forName (c.getName()).newInstance(); 作用是建立c.getName()這個類的例項
3.newInstance() 和new 的區別
eg::::: A a = (A)Class.forName("package.A").newInstance();
A a = new A();
String className = "Example";
Class c = c.Class. forName(className );
c.newInstance();
區別I newInstance() 弱型別,低效率,只能呼叫無參建構函式
new 強型別,相對高效,能呼叫任何public建構函式
II 從jvm角度看,我們使用關鍵字new建立一個新類的時候,這個類可以沒有被載入;但是使用newInstance()的時候,這個類已經載入,這個類已經連線,完成這兩個操作正是Class靜態方法forName()所做的;現在可以看出newInstance()實際上是把new分成了兩步,即首先呼叫類載入器載入某個類,然後例項化。這樣分步也有個好處就是可以降耦,比如你要反射例項化的類繼承了某個基類B b = (A)Class.forName("package.A").newInstance(); B繼承了A 這樣就降耦了。