利用java反射調用類的屬性和方法
阿新 • • 發佈:2018-10-08
strong lec 測試結果 正在 bject cte static err ucc 十一結束了,盼望著的十一要做的事情也沒有做成。有時候的預期和現實總是有些許的變故,Economic freedom--閑扯結束。今天,就簡單點。
一、定義
java反射:程序運行時,通過反射獲取類的所有屬性和方法, 動態創建對象,調用對象的屬性和方法。
二、Method
是位於java.lang.reflect包下 在java反射中 共有四種方法: 1、getMethods();獲得類的public類型方法 2、getMethod(String name, params);獲得類的特定方法 name 參數指定的方法名字、params方法對應的參數 3、getDeclaredMethods();獲取類中所有方法(public、protected、default、private) 4、getDeclaredMethod(String name, params);獲得類的特定方法 invoke(Object obj, Object arg[]);方法接收的參數必須為對象
三、定義測試類
package com.css.java.learning.massbag; public class AllMethod { /*定義兩個私有屬性 */ private String name;//測試屬性獲取 private String sex;//測試獲取所有私有屬性 /*定義一個有參,公有構造函數 */ public static String youcan(String aa){ System.err.println("java通過反射操作方法:有參" + aa); return "success"; } /*定義一個無參,公有構造函數 */ public static void wucan(){ System.err.println("java通過反射操作方法:無參"); } /*定義一個無參,私有構造函數 */ @SuppressWarnings("unused") private static void siyou(){ System.err.println("java通過反射操作方法:私有"); } /*測試私有屬性調用和賦值 */ @SuppressWarnings("unused") private void shuxing(){ System.err.println(name + "正在利用java反射調用私有屬性"); } /*測試私有屬性調用和賦值 */ @SuppressWarnings("unused") private void allshuxingh(){ System.err.println(name + sex); } }
四、java反射技術的實現
//通過反射操作方法 public static void main(String[] args) { AllMethod test = new AllMethod(); Class<?> allm = test.getClass(); try { Method m; /*公有方法調用 */ //有參數 m = allm.getMethod("youcan", String.class); m.invoke(test, "有參數的調用!");//對象和參數 //無參數 m = allm.getMethod("wucan"); m.invoke(test); /* * 私有方法調用 */ m = allm.getDeclaredMethod("siyou"); m.setAccessible(true); m.invoke(test); /*獲取私有屬性 * 和私有屬性的賦值 */ Field filed = allm.getDeclaredField("name");//獲取單個私有屬性 //設置訪問私有屬性權限 filed.setAccessible(true); //調用和設置私有變量屬性 filed.set(test, "測試私有屬性賦值"); m = allm.getDeclaredMethod("shuxing"); m.setAccessible(true); m.invoke(test); Field[] fid = allm.getDeclaredFields();//獲取所有私有屬性 for (int i = 0; i < fid.length; i++) { fid[i].setAccessible(true);//權限訪問私有屬性 fid[i].set(test, i + "測試20181008"); } m = allm.getDeclaredMethod("allshuxingh"); m.setAccessible(true);//權限訪問私有方法 m.invoke(test); } catch (Exception e) { e.printStackTrace(); } }
五、測試結果
利用java反射調用類的屬性和方法