詳解Java反射創建對象

一、什麼是反射

Java Reflaction in Action中的解釋:反射是運行中的程序檢查自己和軟件運行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在運行時根據指定的類名獲得類的信息 個人理解:就是我們對於創建對象我們除瞭通過 new關鍵字創建外,還能通過什麼創建呢?private的屬屬性真的不能獲取嗎?反射就能做到打破這些所謂的規則反射和new創建對象誰的效率高? new

二、通過類對象調用newInstance()方法,適用於無參構造方法

2.1 類名.class

public class Main {
 
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        Class<Person> clazz = Person.class;
        Person person = clazz.newInstance();
        System.out.println(person instanceof Person); // true
    }
}
 
class Person {
 
    private Integer age;
 
    private String name;
 
    public Person() {
    }
}

2.2 Class.forName

public class Main {
 
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        Class<?> clazz = Class.forName("com.best.test.Person");
        Person person = (Person) clazz.newInstance();
        System.out.println(person instanceof Person); // true
    }
}
 
class Person {
 
    private Integer age;
 
    private String name;
 
    public Person() {
    }
}

2.3 對象名.getClass

public class Main {
 
    public static void main(String[] args) throws IllegalAccessException, InstantiationException{
        Person person = new Person();
        Class<? extends Person> clazz = person.getClass();
        Person person1 = clazz.newInstance();
        System.out.println(person1 instanceof Person); // true
    }
}
 
class Person {
 
    private Integer age;
 
    private String name;
 
    public Person() {
    }
}

三、getConstructor()和getDeclaredConstructor()

通過類對象的getConstructor()或getDeclaredConstructor()方法獲得構造器(Constructor)對象並調用其newInstance()方法創建對象,適用於無參和有參構造方法。

3.1 getConstructor()

public class Main {
 
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<Person> clazz = Person.class;
        Constructor<Person> ctor = clazz.getConstructor(Integer.class, String.class);
        Person person = ctor.newInstance(26, "jak");
        System.out.println(person instanceof Person); // true
    }
}
 
class Person {
 
    private Integer age;
 
    private String name;
 
    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }
}

3.2 getDeclaredConstructor()

public class Main {
 
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<Person> clazz = Person.class;
        Constructor<Person> ctor = clazz.getDeclaredConstructor(String.class);
        Person person = ctor.newInstance("jak");
        
        System.out.println(person instanceof Person); // true
    }
}
 
class Person {
 
    private Integer age;
 
    private String name;
 
    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }
 
    public Person(String name) {
        this.name = name;
    }
}

3.3 getConstructor()和getDeclaredConstructor()區別

getDeclaredConstructor(Class<?>… parameterTypes) 

這個方法會返回指定參數類型的所有構造器,包括public的和非public的,當然也包括private的。getDeclaredConstructors()的返回結果就沒有參數類型的過濾瞭。

再來看getConstructor(Class<?>… parameterTypes)

這個方法返回的是上面那個方法返回結果的子集,隻返回指定參數類型訪問權限是public的構造器。getConstructors()的返回結果同樣也沒有參數類型的過濾。

參考文章

到此這篇關於詳解Java反射創建對象的文章就介紹到這瞭,更多相關Java反射創建對象內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: