鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ Java反射

Java反射

Class c = Class.forName("com.reflect.Car");
Object o = c.newInstance();                           
Method method = c.getMethod("run", String.class, int.class);
method.invoke(o, "tengj", 10);

反射的代碼如上

c.newInstance()//代表獲取一個(gè)實(shí)例
(Car)c.newInstance()

如果把它強(qiáng)制轉(zhuǎn)化成Car類型,不是就可以直接用這個(gè)對(duì)象了嗎?
為什么還要用method.invoke()來(lái)調(diào)用方法?不是更麻煩了嗎?

為什么要用反射?

回答
編輯回答
吢丕

(Car)c.newInstance() 如果你的代碼能這么寫,那說(shuō)明你的 class 文件中本身就有 Car 的簽名引用。
換句話說(shuō)你的代碼能這樣寫時(shí),你也完全可以使用 new Car() 來(lái)代替 c.newInstance() 創(chuàng)建對(duì)象。

所以題主你的場(chǎng)景假設(shè)本身就存在問題。

2017年3月24日 07:22
編輯回答
硬扛

舉個(gè)例子:動(dòng)態(tài)代理,你是無(wú)法準(zhǔn)確獲取代理類的類名的,雖然它的一般命名規(guī)則是$+類名,但有時(shí)不一定是這個(gè),那這個(gè)時(shí)候就只能用method去調(diào)用了,或者說(shuō),用這種方式更加準(zhǔn)確。

2017年4月16日 23:16
編輯回答
伴謊

反射通常用在你不清楚這個(gè)類的具體類型的情況下,所以強(qiáng)制轉(zhuǎn)換有時(shí)是寫不出的,這時(shí)就需要用invoke了,很多庫(kù)或工具的實(shí)現(xiàn)里需要用到反射。

舉個(gè)例子,你想實(shí)現(xiàn)一個(gè)通用web框架,可以通過在方法上加注解的方式去注冊(cè)一個(gè)restful接口,當(dāng)請(qǐng)求來(lái)的時(shí)候,框架代碼需要搜索注解來(lái)決定調(diào)用那個(gè)方法,搜索到注解之后,在框架的代碼里,是不知道這個(gè)方法所屬的類的,只能通過invoke來(lái)調(diào)用了。

2017年10月4日 17:57
編輯回答
深記你

有些類,直接引用不到,所以采用反射的

2018年5月13日 04:50
編輯回答
大濕胸

直接將newInstance()出來(lái)的對(duì)象強(qiáng)轉(zhuǎn),再調(diào)用也行的,效果一樣。
只是很多時(shí)候我們并不知道這個(gè)對(duì)象的類名,因此無(wú)法直接強(qiáng)轉(zhuǎn),所以采用invoke()方法,很多框架中都是用的invoke

2018年9月3日 14:02
編輯回答
巴扎嘿

給你個(gè)方法,看一下,估計(jì)你就明白了。

public static T <T> getInstance(Class<T> type){
    return type.newInstance();
    //try catch 
}

反射大部分情況,都是用于動(dòng)態(tài)編程,也就是說(shuō),一個(gè)使用反射的地方,通常都是你不知道會(huì)傳入什么類型的對(duì)象,然后通過反射的相關(guān)內(nèi)容,獲取類中的信息,從而進(jìn)行相關(guān)處理

2018年9月21日 07:20