反射機制的簡單理解-Class類

理論點:首先我們在平時編程過程中,經常會去獲得實例對象。 

               new一個對象,是我們常用的方法。

               所以,每次我們需要一個對象實例的時候就需要提前編譯,這就帶有侷限性。

               那我們可不可以在需要用到的時候再去創建這個類呢,而且還可以只需要其中的一個方法或者一個屬性。

               那麼,反射機制是可以做到這點的,而動態生成正是反射的最大的實用點。

               我們可通過類對象的方法獲取類實例,也可獲取類方法、變量等。        

常用方法:

               1、Class類:代表一個類

               2、Field類:代表類的成員變量(類的屬性)

               3、Method類:代表類的方法

               4、Constructor類:代表類的構造方法

               5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法

實例創建:

類:

package moBanClass;

public class Hero {	
    //定義變量
    public String name;
    public int age;
    public String sex;
    //私有變量
    private String money;

    //共有方法
    public void showName() {
       System.out.println("My Name Is LinDa~");
    }
    //私有方法
    private void showMoney() {
       System.out.println("No Money!");
    }
}

獲取類對象:

//首先獲取類對象,有4種方式 

1.Class class=Hero.class;

2.Class class=Class.forName("moBanClass.Hero");
		
3.Class<Hero> class=new Hero().getClass();----//非經常使用,畢竟都有了對象還反射干嘛

//前三種無需獲得Class類對象,但是ClassLoader則需要先獲得ClassLoader對象

4.Class<Hero> class=ClassLoader.getSystemClassLoader().loadClass("moBanClass.Hero");

獲取實例對象:

//獲取類構造器
Constructor c= class.getConstructor();

//new一個實例
Hero hero =c.newInstance();

亦可:
Hero hero= Hero.class.getConstructor().newInstance();

也可直接獲取屬性變量:

但是得注意此處所用的方法:
1.Field[]  getFields(null   /  String fieldName):獲取  所有的/某一個 "公有字段"。
2.Field[]  getDeclaredFields(null  /  String fieldName):獲取  所有的/某一個字段,公共或私有皆可。

//類對象
Class<Hero> clazz=Hero.class;
//實例對象
Hero hero=clazz.getConstructor().newInstance();
		
//獲取name屬性
Field fieldName=clazz.getField("name");
fieldName.set(hero, "panda");
System.out.println(hero.name);          
-------------------------------------	
 //hero.name=panda
	
//獲取所有公共屬性
Field[] fields=clazz.getFields();
    for (Field field : fields) {
	System.out.println(field);            
    }
-------------------------------------
//field:
  public java.lang.String moBanClass.Hero.name
  public int moBanClass.Hero.age
  public java.lang.String moBanClass.Hero.sex
		
//獲取所有公共或私有屬性
Field[] fields2=clazz.getDeclaredFields();
    for (Field field2 : fields2) {
	System.out.println(field2);
    }
-------------------------------------
//field:
  public java.lang.String moBanClass.Hero.name
  public int moBanClass.Hero.age
  public java.lang.String moBanClass.Hero.sex
  private java.lang.String moBanClass.Hero.money

同樣,也可以利用反射獲取方法,但是此處一樣需要注意

1.public Method[] getMethods(String name,Class<?>... parameterTypes):獲取所有"公有方法"。

2. public Method[] getDeclaredMethods(String name,Class<?>... parameterTypes):獲取所有的成員方法,包括私有的(不包括繼承的)。

同樣也可以只獲取單個方法。

//獲取showName方法
Method method=clazz.getMethod("showName");
method.invoke(hero);
-------------------------------------
//My Name Is LinDa~
		
//獲取所有公共方法
Method[] methods=clazz.getMethods();
for (Method method2 : methods) {
    System.out.println(method2);
}
-------------------------------------
//public void moBanClass.Hero.showName()

//獲取所有公共或私有方法
Method[] methods2=clazz.getDeclaredMethods();
for ( Method method2 : methods2) {
    System.out.println(method2);
}
//public void moBanClass.Hero.showName()
//private void moBanClass.Hero.showMoney()

以上就是反射常用的一些方法,具體的要用的方法可去API查詢~增強理解~

 

 

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