1. 程式人生 > >Java反射機制總結

Java反射機制總結

catch lan 備註 const trace wan tor 通過 win

首先咱們要知道什麽是類對象:類對象就是記錄某個類本身的構造方法、屬性、方法的對象。

1. 獲取類對象的三種方式

Class.forName(‘完整類名‘)
類名.class
new 類名().getClass()

示例:用反射來創建一個新的對象。

package reflection;
import java.lang.reflect.Constructor;
import dealreflect.Hero;
public class TestReflection {
  
    public static void main(String[] args) {
          
        
try { //使用反射的方式創建對象 String className = "dealreflect.Hero"; //類對象 Class pClass=Class.forName(className); //構造器 Constructor c= pClass.getConstructor(); //通過構造器實例化 Hero h2= (Hero) c.newInstance(); h2.name
="gareen"; System.out.println(h2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

2. 反射類裏面的方法

1.加載類 Class clazz = Class.forname("完整類名")

2.加載方法 Method method = clazz.getMethod("方法名",String.class,int.class(參數類型))

3.運行方法 method.invoke(類的實例,傳參)

註意這兒得傳類的實例,類對象是不行的。

反射main()方法

1.加載類 Class clazz = Class.forname("完整類名")

2.加載方法 Method method = clazz.getMethod("main",String[] args);

3.運行方法,比較奇怪 method.invoke(null,new Object[](new String[]{"aa","bb"})) 或者 method.invoke(null, Object(new String[]{"aa","bb"}))

因為在往主函數裏傳String數組的時候,程序會自己拆分成String a1,String a2

3. 反射類裏面的字段

1.加載類 Class clazz = Class.forname("完整類名")

[clazz.setAccessible(true)] 進行暴力反射,就可以拿到private屬性或方法的值了。

2.加載字段 Field f = clazz.getField("字段名")

備註:getField和getDeclaredField的區別

這兩個方法都是用於獲取字段
getField 只能獲取public的,包括從父類繼承來的字段。

getDeclaredField 可以獲取本類所有的字段,包括private的,但是不能獲取繼承來的字段。 (註: 這裏只能獲取到private的字段,但並不能訪問該private字段的值,除非加上setAccessible(true))

3.獲得字段的值
String name = (Stirng) f.get(p)
或者 Object value = f.get(p)

4.獲取字段的類型
Class type = f.getType();

5.設置字段的值
f.set(p,"xxxxxxxx")

Java反射機制總結