java反射機制

一、思想
之前在瞭解java的反射機制沒有在思想上一個透徹的理解,解釋使用的時候,用用就行了,也沒有考慮太多,最近在用着用着突然間感覺了有了不一樣的心理感覺,在這裏就分享給大家:
1、Class類是一個什麼類
我們在封裝一個類,例如人,它具有的屬性、方法行爲就把它封裝在了一個java對象中,那麼根據這種思想,所有的java對象,有什麼樣的特徵呢,有繼承關係、有類的名稱、類的屬性、類的方法,這些可以再抽象出一個類,那就是Class類;
2、Class類對象的創建
Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。
        創建Class對象的三種方式:
   
Class userClass=User.class;
Class userClass1=new User().getClass();
Class userClass2=Class.forName("test.reflectTest.User");


二、反射

1、反射的思想
反射就是把java的各個成分反射成爲相應的java對象;

2、反射的對象
這裏只是舉幾個簡單的例子,具體的特性還是查看JDK的API文檔:
package test.reflectTest;

public class User {
public User(){}
public User(String str){
name=str;
}
public String name="a";
public int sex;

public String say(String str){
return str;
}
public void run(){
System.out.println(name);
}
}


映射構造函數類對象
Constructor constructor = userClass.getConstructor(String.class);//映射成相應的構造器對象
User newInstance = (User) constructor.newInstance("zhangsan");//根據這個構造器對象,創建相應的對象


映射成屬性字段類對象
Field field = userClass.getDeclaredField("name");//映射成Field對象,表示的屬性爲name
System.out.println(field.getType());//得出該屬性的類型
System.out.println(field.getName());//得出該屬性的名稱
System.out.println(field.get(new User()));//得出該屬性的值


映射成方法類對象

Class userClass=User.class;
Method method = userClass.getMethod("say", String.class);
//調用new User()對象的say函數,傳參"helloworld"
System.out.println(method.invoke(new User(), "helloworld"));
這裏應注意的是:當調用的 是一個靜態的方法時,對象應該設置爲null,原因是靜態方法執行是在生成對象之前執行的;
method.invoke(null, "helloworld")



在此最上面的例子的思想做說明:
Class是所有類的抽象出來的用來封裝類得各個特性(繼承關係、包名、屬性、方法)的類,當映射成某一個對象的時候,例如一個Method這時對象,這時這個Method對象,已經是一個對象了,它所表示的內容例如:Method method = userClass.getMethod("say", String.class);,表示的只是say這個方法並且參數只有一個是String類型參數的一個Method的對象!







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章