反射調用一般有幾個知識點:
-
得到要調用類的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);
}
