下面範例使用Java的Class.forName().newinstance()
產生物件實例。
idv.matt.demo.User
為要被建立的物件的類別。
User.java
package idv.matt.demo;
public class User {
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public User() {}
// getters and setters...
}
使用Class.forName().newinstance()
建立實例。forName()
的類別名稱為包含package的完整名稱(fully qualified name)。
package idv.matt.demo;
import java.lang.reflect.InvocationTargetException;
public class App {
public static void main(String[] args) {
try {
User user1 = (User) Class.forName("idv.matt.demo.User").newInstance();
User user2 = (User) Class.forName("idv.matt.demo.User").getConstructor(String.class, Integer.TYPE)
.newInstance("Bob", 14);
System.out.println(user1.getName()); // null
System.out.println(user2.getName()); // Bob
System.out.println(user2.getAge()); // 14
} catch (InstantiationException
| IllegalAccessException
| ClassNotFoundException
| NoSuchMethodException
| SecurityException
| IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
}
}
ㄧ般在Java程式中都是以new
關鍵字加上類別的建構式來產生物件實例,例如new User();
,但這是在編譯時就要知道被建構的類別的情況;如果在編譯時無法知道要被建構的類別,而是在執行期間(runtime)才能知道被建構的類別,就必須利用以上的方式來動態產生實例。
典型的例子就是在建立JDBC連線時,我們會使用以下方式來註冊資料庫的JDBC driver (JDBC 4.0以前)。透過這樣的方式使得在佈署應用程式時不用包含driver的jar檔,可以在日後透過修改設定檔或properties檔來決定要使用的Driver,而無須修改程式本身。
Class.forName("oracle.jdbc.driver.OracleDriver");
參考:
沒有留言:
張貼留言