①載入類[3個方式]
person有2個屬性,name和age,最後會給出person類的資訊
class clazz1 = class.forname("person");
class clazz2 = person.class;
person p = new person();
class clazz3 = p.getclass();
②構造器constructor
constructor c = clazz.getconstructor(null);//獲取的是無參構造
person person1 = (person) c.newinstance(null);
system.out.println(person1.name);
constructor c1 = clazz.getconstructor(string.class);//獲取string引數的構造
person p2 = (person) c1.newinstance("a"); //給引數,例項化
system.out.println(p2.name);
constructor c1 = clazz.getdeclaredconstructor(string.class,int.class);
c1.setaccessible(true); //暴力反射,因為這裡的構造是私有的,不設定會報錯
person p2 = (person) c1.newinstance("a",12);
system.out.println(p2.name);
//person中的私有建構函式
private person(string name,int age)
③方法method
person person = new person(); //這裡給出接下來要執行方法的物件
method m = clazz.getmethod("get", string.class);//get是person類中已經定義的方法名,後面是引數型別
m.invoke(person, "coci");//執行方法
method method = clazz.getmethod("set", string.class,int.class);
object object = method.invoke(person, "csq",21); //後面2個是給出方法執行的引數
system.out.println("返回值 = "+object);
④域field
field field = clazz.getfield("name");//getfield,只能得到公有的域
system.out.println(field.gettype()); //得到域的型別
if(field.gettype().equals(string.class))
field field2 = clazz.getdeclaredfield("age");//getdeclaredfield,這個方法可以得到私有的域&公有的域
field2.setaccessible(true);
system.out.println(field.get(person)+"=="+field2.get(person));
person
class person
public person(string name)
private person(string name,int age)
public void get(string name)
public static void get()
public int set(string name,int age)
}
反射的理解
反射 1 類的物件 依據我們定義的類 new 出來的物件,也成為例項物件 2 類物件 是類載入的產物,包括 包名,類名,屬性,方法,構造方法 獲取類物件 方式 通過反射的技術獲取類物件 會導致類先進行類載入 通過 類的物件 獲取 類物件 student s new student class c s...
反射的理解
class類物件的三種例項化模式 通過物件的確取得了物件的 這就是 反 的本質 在反射的世界裡它再看重的不再是乙個物件,而是物件身後的組成 類 構造 成員.取得class類物件的好處 可以直接通過反射例項化物件 newinstance public static void main string a...
反射 基於反射的簡單工廠
得到type的幾種方法 1.0通過typeof方法得到type type t1 typeof form1 2.0根據物件得到type person p new person type t2 p.gettype 3.0根據程式集得到對應的type assembly ass assembly.load ...