1. 程式人生 > >對於反射機制原理的理解

對於反射機制原理的理解

反射: 動態獲取一個類的位元組碼檔案物件 從而獲取到物件中的所有的內容(欄位 函式 建構函式等)
1)獲取位元組碼檔案物件 Class
2)通過Class對類進行描述

1.準備好一個實體類

public class Person {
    private String name;
    private int age;

    public void print(){
        System.out.println(name+"---------"+age);
    }

    public void fun(int num,String str){
        System.out
.println("num="+num+",str="+str); } public static void staticFun(){ System.out.println("staticFun run"); } private void show(){ System.out.println("show run"); } }

2.獲取位元組碼檔案物件的方式(三種,後兩種較為常見)


     // 1.通過物件的getClass()方法獲取

    public static void getClassObject01
(){ Person p=new Person(); Class clazz=p.getClass(); Person p1=new Person(); Class clazz1=p1.getClass(); System.out.println(clazz==clazz1);//true } // 2.通過資料型別的class屬性獲取該型別的位元組碼檔案物件 public static void getClassObject02(){ Class clazz=Person.class; System.out
.println(clazz.getName()); } // 使用Class類中的方法獲取 forName(className) // 不需要明確具體的類或者是物件 只需要類的包名加類名即可 public static void getClassObject03(){ try { Clas clazz=Class.forName("com.yztc.bean.Person"); System.out.println(clazz.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }

3.通過位元組碼檔案物件對類進行描述

    // 1. 動態獲取指定的位元組碼檔案物件中的內容
    //    位元組碼檔案中的方法

    public static void getFuncation(){
        //1)獲取位元組碼檔案物件
        Class clazz=Person.class;
        //2)呼叫Class類中的方法獲取位元組碼檔案物件中的所有的函式
        //注意:getMethods()獲取類中的公有方法 ;包括父類中的函式
        Method[] meshods=clazz.getMethods();
        //獲取類中所有的方法 包含私有 但是不包含繼承父類的
        meshods=clazz.getDeclaredMethods();
        //3)遍歷
         for(Method method:meshods){
             System.out.println(method);
         }
    }

//-----------------------------------------
//2. 獲取類中的單個無引數方法

    public static void getSingleFuncation(){
        Class clazz=Person.class;
        try {
            Method method=clazz.getMethod("print", null);//訪問person類中無引數的print()方法
            //呼叫位元組碼檔案物件中的newInstance獲取指定的位元組碼檔案物件的例項
            Object obj=clazz.newInstance();
            method.invoke(obj, null);//呼叫person位元組碼檔案物件例項中的print方法  new person().show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
//-----------------------------------------

//3.獲取類中帶引數的方法以及靜態方法

    public static void getParmasFuncation(){
         Class clazz=Person.class;
         try {
            Method method=clazz.getMethod("fun",int .class ,String.class);
            Object obj=clazz.newInstance();
            method.invoke(obj, 10,"ok");//new Person().fun(100,"哈哈哈哈哈哈哈哈")
            //呼叫靜態函式
            Method method2=clazz.getMethod(" staticFun" , null);
            method2.invoke(null, null);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

 //-----------------------------------------
 //4.獲取類中私有方法

    public static void getPrivateFuncation(){
        Class clazz=Person.class;
        try {
            Method method=clazz.getDeclaredMethod( "show",  null);
            //訪問私有方法存在異常 如果想要訪問  暴力訪問 將私有的許可權取消掉
            method.setAccessible(true);
            Object obj=clazz.newInstance();
            method.invoke(obj, null);
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
 //-----------------------------------------
 //5.訪問類中構造方法
public void getconstructor(){
        Class clazz= Person.class;
        try {
            Constructor cons=clazz.getConstructor (null);
            Object obj=cons.newInstance(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }