更新時(shí)間:2019-08-15 10:50:31 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2619次
一、Java反射拿到調(diào)用對(duì)象的方法
1、通過(guò)Class.forName(“包名+方法的類(lèi)名”)拿到方法的對(duì)象;
如:Class clazz = Class.forName("ReflectionTest");
也可以通過(guò)實(shí)例,獲取方法的對(duì)象類(lèi),
如:String str = "test , reflection";
Class clazz = str.getClass();
2、明確反射方法名稱(chēng) ;
3、明確方法的參數(shù)類(lèi)型,就可以拿到對(duì)象的方法。
如:Method method = clazz.getMethod("test",String.class,int.class);
二、接著就是invoke()調(diào)用方法了:
1、實(shí)例化對(duì)象,可以直接調(diào)用已創(chuàng)建的對(duì)象,也可以newInstance()一個(gè)。
2、確定具體方法的參數(shù)
如: Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);
System.out.println("直接反射:"+obj1);
三、補(bǔ)充一些關(guān)于Java反射的知識(shí):
Java反射的作用:在Java代碼編譯時(shí),可以通過(guò)反射訪問(wèn)裝載到JVM中類(lèi)的內(nèi)部信息。
如: Clazz.getName()獲取類(lèi)的完整名字
getPackage()獲取此類(lèi)所屬的包
getSuperclass() 獲取父類(lèi)對(duì)應(yīng)的Class對(duì)象
getFiled(String name) 獲得類(lèi)的指定成員變量
getMethods() 獲得類(lèi)的public類(lèi)型的方法
getMethod(String name, Class[] args) 獲取類(lèi)的指定方法
四、具體實(shí)例:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectionTest {
public String test(String name ,int age) {
return name+",今年"+age+"歲,是一個(gè)極富好奇心地樂(lè)觀青年!";
}
public static void main(String args[]) {
String str = "test , reflection";
int len1 = str.length();
System.out.println("直接調(diào)用length() :"+len1);
//反射String.length()方法
//直接填入調(diào)用該方法的對(duì)象str,這里不需要newInstance()
Object len2 = Reflection(str,str.getClass(),"length",null,null);
System.out.println("java 反射調(diào)用length() :"+len2);
Class clazz;
try {
//調(diào)用自己創(chuàng)建的函數(shù),
//反射得到類(lèi) 包名+類(lèi)名,我這邊沒(méi)有包名就直接是 "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);
//創(chuàng)建函數(shù)完成反射
//創(chuàng)建參數(shù)class 類(lèi)型的數(shù)組
Class cla[] = {String.class,int.class};
Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);
System.out.println("創(chuàng)建函數(shù)完成反射: "+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();
}
}
/*
* 通過(guò)反射執(zhí)行cclass的方法
* @param object ---調(diào)到該方法的具體對(duì)象
* @param cclass ---具體對(duì)象的class類(lèi)型
* @param paramClasses ---反射方法中參數(shù)class類(lèi)型
* @param methodName ---反射方法的名稱(chēng)
* @param args ----調(diào)用該方法用到的具體參數(shù)
*
*
* */
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;
}
}
/* 運(yùn)行結(jié)果:
直接調(diào)用length() :17
java 反射調(diào)用length() :17
直接反射:xiaojun,今年23歲,是一個(gè)極富好奇心地樂(lè)觀青年!
創(chuàng)建函數(shù)完成反射: 小君,今年22歲,是一個(gè)極富好奇心地樂(lè)觀青年!*/
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)