java反射用法——創建對象、調用方法、讀寫成員變量


反射調用一般有幾個知識點:

  • 得到要調用類的class
  • 通過class創建對象實例
  • 得到要調用的類中的方法(Method)
  • 方法調用(invoke)
  • 獲取反射對象的變量
  • 設置反射對象的私有變量可更改

 

    /**
     * 
     * @param className 類路徑的名字
     * @return 返回根據className指明的類信息
     */
    public static Class getclass(String className){
        Class c=null;
        try {
            c=Class.forName(className);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        return c;
    }
 
    /**
     * 
     * @param name 類路徑
     * @param classParas Class類信息參數列表
     *  如果是基本數據類型是可以使用其Tpye類型,如果用class字段是無效的
     *  如果是非數據類型可以使用的class字段來創建其Class類信息對象,這些都要遵守。
     * @param paras      實際參數列表數據
     * @return           返回Object引用的對象,實際實際創建出來的對象,如果要使用可以強制轉換為自己想要的對象
     * 
     * 帶參數的反射創建對象
     */
    public static Object getInstance(String name,Class classParas[],Object paras[]){
        Object o=null;
        try {
            Class c=getclass(name);
            Constructor con=c.getConstructor(classParas);//獲取使用當前構造方法來創建對象的Constructor對象,用它來獲取構造函數的一些
            try {
                //信息
                o=con.newInstance(paras);//傳入當前構造函數要的參數列表
            } catch (InstantiationException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalArgumentException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InvocationTargetException ex) {
                Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return o;//返回這個用Object引用的對象
    }
 
    /**
     * 
     * @param name 類路徑
     * @return 不帶參數的反射創建對象
     */
    public static Object getInstance(String name){
        Class c=getclass(name);
        Object o=null;
        try {
             o=c.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ClassMain.class.getName()).log(Level.SEVERE, null, ex);
        }
        return o;
    }
  

  /**
  *
  * @param className 類路徑
  * @param methodName 成員方法名字
  * @param param 參數值
  * @return
  */
  public static void call(String className, String methodName, Integer param){
    Class cls = Class.forName(className);
    Object obj = cls.newInstance();
    Method method = cls.getDeclaredMethod(methodName, Integer.class);
    method.invoke(obj, param);
  }

  /**
  * 設置私有變量
  * @param className 類路徑
  * @param field 成員變量名字
  * @param value 成員變量值
  * @return
  */
  public static void setPrivateField(String className, String field, int value){
    Class cls = Class.forName(className);
    Object obj = cls.newInstance();
    Field field = cls.getDeclaredField(field);
    field.setAccessible(true);//設置允許訪問
    field.set(obj, value);
  }

  

 

用法如下:

 

public static void main(String args[]){
        //創建不帶參數的對象
        //ReflectClass rc1=(ReflectClass) ClassXXX.getInstance("com.jijing.classDemo.ReflectClass");
//System.out.println("ReflectClass111="+rc1); System.out.println("******************************"); ReflectClass rc2=(ReflectClass) ClassXXX.getInstance("com.jijing.classDemo.ReflectClass", new Class[]{Integer.TYPE,String.class,MyClass.class}, new Object[]{20,"我是ReflectClass",new MyClass("我是MyClass")}); System.out.println("ReflectClass222="+rc2);
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM