天天看點

Java反射 - [執行個體示範] 建立類的對象多種方式

Java通過反射可以建立類的對象

建立類的對象方式除了​​

​new​

​​,​

​Class.newInstance()​

​​這兩種方式可以建立共有的構造函數的對象外

還可以通過​​

​Constructor類​

​來設定反射對象的accessible标志為true,來建立私有構造器類的對象.

反射定義

反射機制指的是程式在運作時能夠擷取自身的資訊。在java中,隻要給定類的名字,那麼就可以通過反射機制來獲得類的所有屬性和方法。

反射的作用

  • 在運作時判斷任意一個對象所屬的類。
  • 在運作時判斷任意一個類所具有的成員變量和方法。
  • 在運作時任意調用一個對象的方法
  • 在運作時構造任意一個類的對象

原址 : ​​反射有什麼作用​​

案例示範

這個案例将通過new與反射的方式來建立私有以及共有構造器類的對象.
package top.clearlight.coretech.reflect;

import java.lang.reflect.Constructor;

public class ReflectTest {
    public static void main(String[] args) throws Exception {
        // "PriConstructO' has private access in ' top. clearlight. coretech. reflect. PriConstruct'
        // PriConstruct pri = new PriConstruct();

        // 建立私有 無參 構造器的類對象的方式
        Constructor<PriConstruct> dc = PriConstruct.class.getDeclaredConstructor();
        dc.setAccessible(true);
        PriConstruct pri = dc.newInstance();
        System.out.println("Constructor對象建立私有無參構造器類的對象 : " + pri.toString());

        // 建立私有 有參 構造器的類對象的方式
        Constructor<PriConstruct> dc2 = PriConstruct.class.getDeclaredConstructor(String.class, int.class);
        dc2.setAccessible(true);
        PriConstruct pri2 = dc2.newInstance("Marry", 17);
        System.out.println("Constructor對象建立私有有參構造器類的對象 : " + pri2.toString());

        System.out.println("----------------");

        // 建立對象的第一種方式
        PubConstruct pub = new PubConstruct();
        System.out.println("new方式構造的對象 : " + pub.toString());
        // 建立對象的第二種方式
        PubConstruct pubConstruct1 = pub.getClass().newInstance();
        System.out.println("對象.getClass().newInstance()方式構造的對象 : " + pubConstruct1.toString());
        // 建立對象的第三種方式
        PubConstruct pubConstruct = (PubConstruct) Class.forName("top.clearlight.coretech.reflect.PubConstruct").newInstance();
        System.out.println("Class.forName(全限定類名).newInstance()方式2構造的對象 : " + pubConstruct.toString());
        
        // 建立對象的第四種方式
        PubConstruct pubConstruct2 = PubConstruct.class.newInstance();
        System.out.println("類名.class.newInstance()方式建立對象 : " + pubConstruct2.toString());
    }
}

class PriConstruct {
    private String name;
    private int age;
    private PriConstruct() { }

    private PriConstruct(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "PriConstruct{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

class PubConstruct {
    PubConstruct() { }

    @Override
    public String toString() {
        return "公有的構造器的類";
    }
}