理論點:首先我們在平時編程過程中,經常會去獲得實例對象。
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查詢~增強理解~