網頁

2018/11/10

Java 使用Class.forName().newinstance()產生物件實例。

下面範例使用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");

參考:

沒有留言:

張貼留言