java反射的使用

    java中的反射經常被用在一些框架搭建上,他能夠讓我們很方便的對自己未來將使用的類,方法和變量進行訪問。個人覺得有種黑客的味道在裏面。當我們知道一個類的類名後,我們基本上可以使用反射的到它的一切。包括他的private的方法和變量等(當然訪問他們的使用需要使用的是getDeclared***(**))。另外,據說反射是比較消耗性能的,故而出了框架搭建外,一般用得不多。

   1.基本常用的反射使用。

      Class.forName("****");這個語句是java連接數據庫的第一個語句。

   2.通過構造器創建反射類實例。

      首先,獲取反射類的構造器。   構造器類.class.get構造器等方法。

      然後,我們再獲取構造器需要的參數類型。

      最後,我們再利用newinstance方法來構建其實例。

   3.利用反射來獲取一個類的方法或者屬性。

      需要注意的是訪問private的方法和變量,使用需要使用的是getDeclared***(**)。變量我們還需要用.setAccessible(true).

    具體實例如下:

       有了如下的代碼,只要有個類名的字符串,你就可以獲得它這個類的一切東西,包括私有屬性和方法。


   //リフレクトで、クラスのconstructorを取得し、情報も取得する。
   Class reflectBeanClass = Class.forName("com.cy.ReflectBean");
   Constructor[] constructors = reflectBeanClass.getConstructors();
   for(Constructor cons : constructors){
                //constructorのParameterTypes
    Class[] parClasses = cons.getParameterTypes();
    int paramLen = parClasses.length;
    if(parClasses != null && paramLen > 0){
     for(Class parClass : parClasses){
      System.out.println(parClass.getName());
     }
    }
    Object objectClass = null;
    switch(paramLen){
       case 0 :
        objectClass = cons.newInstance(null);
        System.out.println("test2 : "+((ReflectBean)objectClass).test2);
        //private屬性の取得と設定
        Field field = objectClass.getClass().getDeclaredField("intValue1");
        field.setAccessible(true);
        System.out.println("name : "+field.getName());
        System.out.println("value : "+field.getInt(objectClass));
        field.set(objectClass,999);
        System.out.println("updated value : "+field.getInt(objectClass));
        break;
       case 1 :
        //リフレクトで、変數変化可能のメソッドを利用する。
        Object[] objectParam = {"陳飛"};
        Class[] pramTypeArray = {int.class,int[].class};
        Object[] paramValueArray = {2,new int[]{3,5,6}};
        objectClass = cons.newInstance(objectParam);
        Method fucMethod = objectClass.getClass().getMethod("fuc",pramTypeArray);
        fucMethod.invoke(objectClass,paramValueArray);
        break;
    }
   }
  

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