Java通過反射可以建立類的對象
建立類的對象方式除了
,
new
Class.newInstance()
這兩種方式可以建立共有的構造函數的對象外
還可以通過
來設定反射對象的accessible标志為true,來建立私有構造器類的對象.
Constructor類
反射定義
反射機制指的是程式在運作時能夠擷取自身的資訊。在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 "公有的構造器的類";
}
}