import java.lang.reflect.InvocationTargetException;
創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供太原網(wǎng)站建設(shè)、太原做網(wǎng)站、太原網(wǎng)站設(shè)計(jì)、太原網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、太原企業(yè)網(wǎng)站模板建站服務(wù),十多年太原做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ApplicationRunner {
public void run(final String canonicalName){
try {
final Class type = Class.forName(canonicalName);
final Object classHost = type.newInstance();
for(final Method method : type.getDeclaredMethods()){
if(isRunnableMethod(method)){
method.invoke(classHost);
}
}
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final InstantiationException e) {
e.printStackTrace();
} catch (final IllegalAccessException e) {
e.printStackTrace();
} catch (final InvocationTargetException e) {
e.printStackTrace();
}
}
private boolean isRunnableMethod(final Method method){
return method.getAnnotation(Test.class) != null
Modifier.isPublic(method.getModifiers())
method.getParameterTypes().length == 0
method.getReturnType().equals(void.class);
}
public static void main(String[] args) {
new ApplicationRunner().run(TestHost.class.getCanonicalName());
}
}
你可以試試我的方法. 而且我建議你直接傳對(duì)象進(jìn)去解析類(lèi).這樣會(huì)容易很多
java的反射用法:(異常請(qǐng)自行處理)
①找到類(lèi):Class cl = Class.forName("java.util.Date");
②創(chuàng)建對(duì)象(要求這個(gè)類(lèi)中含有空參數(shù)的構(gòu)造方法):Object obj = cl.newInstence();
③根據(jù)名稱(chēng)和參數(shù)找方法:Method method1 = cl.getMethod("getTime");//如果沒(méi)有參數(shù)不用寫(xiě)第二個(gè)參數(shù)如果有參數(shù)的如:Method method2 = cl.getMethod("setTime",long.class);
④在某個(gè)對(duì)象上面執(zhí)行方法,Object result = method1.invoke(obj);//如果有參數(shù)的Object result = method2.invoke(obj,21317362721);
執(zhí)行的方如果有返回值,將返回值返回,否則返回null
java開(kāi)發(fā)工程師崗位職責(zé):
1、負(fù)責(zé)公司網(wǎng)站開(kāi)發(fā)和維護(hù);
2、負(fù)責(zé)對(duì)網(wǎng)站進(jìn)行實(shí)施,測(cè)試;
3、負(fù)責(zé)現(xiàn)有網(wǎng)站的維護(hù)和升級(jí);
4、負(fù)責(zé)解決開(kāi)發(fā)過(guò)程中的技術(shù)問(wèn)題;
5、負(fù)責(zé)網(wǎng)站開(kāi)發(fā)文檔編寫(xiě)工作;
6、統(tǒng)一代碼風(fēng)格、監(jiān)督團(tuán)隊(duì)開(kāi)發(fā)、落實(shí)測(cè)試、驗(yàn)收代碼質(zhì)量;
7、參與軟件系統(tǒng)設(shè)計(jì),能編寫(xiě)代碼。
里面的注釋已經(jīng)很清楚了。
首先用Class.forName去取到Class對(duì)象,java中Class、Method都是一種對(duì)象(相對(duì)其它對(duì)象要特殊一點(diǎn),因?yàn)樗鼈兇眍?lèi)的結(jié)構(gòu)),Class中包含Method數(shù)組,也就是Class的方法,這里getDeclaredMethods()取到所有方法對(duì)象到數(shù)組method中,然后用for循環(huán)打印每一個(gè)方法toString信息。
給你一個(gè)小的實(shí)例代碼:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
public class test {
public static void main(String args[]) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("這個(gè)一個(gè)Foo對(duì)象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新設(shè)置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("這是測(cè)試Java反射的測(cè)試類(lèi)");
}
}
1.就是說(shuō)根據(jù)你傳進(jìn)去的對(duì)象類(lèi)型返回相應(yīng)的代理。這個(gè)不是在靜態(tài)編譯時(shí)決定的, 而是運(yùn)行時(shí)決定的,所以叫做動(dòng)態(tài)。this指的是當(dāng)前InvocationHandler對(duì)象,也就是new MyInvocationHandler()出來(lái)的。
2.執(zhí)行RealSubject中的say方法,因?yàn)檫@個(gè)時(shí)候?qū)嶋H的對(duì)象是bind(new RealSubject())。
3.沒(méi)有調(diào)用自己啊。