更新時間:2019-08-15 10:50:31 來源:動力節點 瀏覽2222次
一、Java反射拿到調用對象的方法
1、通過Class.forName(“包名+方法的類名”)拿到方法的對象;
如:Class clazz = Class.forName("ReflectionTest");
也可以通過實例,獲取方法的對象類,
如:String str = "test , reflection";
Class clazz = str.getClass();
2、明確反射方法名稱 ;
3、明確方法的參數類型,就可以拿到對象的方法。
如:Method method = clazz.getMethod("test",String.class,int.class);
二、接著就是invoke()調用方法了:
1、實例化對象,可以直接調用已創建的對象,也可以newInstance()一個。
2、確定具體方法的參數
如: Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
System.out.println("直接反射:"+obj1);
三、補充一些關于Java反射的知識:
Java反射的作用:在Java代碼編譯時,可以通過反射訪問裝載到JVM中類的內部信息。
如: Clazz.getName()獲取類的完整名字
getPackage()獲取此類所屬的包
getSuperclass() 獲取父類對應的Class對象
getFiled(String name) 獲得類的指定成員變量
getMethods() 獲得類的public類型的方法
getMethod(String name, Class[] args) 獲取類的指定方法
四、具體實例:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionTest {
public String test(String name ,int age) {
return name+",今年"+age+"歲,是一個極富好奇心地樂觀青年!";
}
public static void main(String args[]) {
String str = "test , reflection";
int len1 = str.length();
System.out.println("直接調用length() :"+len1);
//反射String.length()方法
//直接填入調用該方法的對象str,這里不需要newInstance()
Object len2 = Reflection(str,str.getClass(),"length",null,null);
System.out.println("java 反射調用length() :"+len2);
Class clazz;
try {
//調用自己創建的函數,
//反射得到類 包名+類名,我這邊沒有包名就直接是 "ReflectionTest"
clazz = Class.forName("ReflectionTest");
//直接java反射得到方法
Method method= clazz.getMethod("test",String.class,int.class);
Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
System.out.println("直接反射:"+obj1);
//創建函數完成反射
//創建參數class 類型的數組
Class cla[] = {String.class,int.class};
Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);
System.out.println("創建函數完成反射: "+obj);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 通過反射執行cclass的方法
* @param object ---調到該方法的具體對象
* @param cclass ---具體對象的class類型
* @param paramClasses ---反射方法中參數class類型
* @param methodName ---反射方法的名稱
* @param args ----調用該方法用到的具體參數
*
*
* */
public static Object Reflection(Object object ,Class cclass,String methodName,Class[] paramclasses, Object... args) {
try {
Method method = cclass.getMethod(methodName,paramclasses);
return method.invoke(object,args);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
/* 運行結果:
直接調用length() :17
java 反射調用length() :17
直接反射:xiaojun,今年23歲,是一個極富好奇心地樂觀青年!
創建函數完成反射: 小君,今年22歲,是一個極富好奇心地樂觀青年!*/
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習