android 反射调用方法可不可以重载,使用Java进行反射投射和重载方法调度
請(qǐng)注意,所有代碼都是一個(gè)簡(jiǎn)化示例,目的是僅傳達(dá)我的問(wèn)題的核心思想。它應(yīng)該都經(jīng)過(guò)輕微的編輯后編譯并運(yùn)行。使用Java進(jìn)行反射投射和重載方法調(diào)度
我有幾個(gè)類(lèi)都實(shí)現(xiàn)了一個(gè)通用接口。
public interface Inter{}
public class Inter1 implements Inter{}
public class Inter2 implements Inter{}
在一個(gè)單獨(dú)的I類(lèi)有類(lèi)型間,我使用來(lái)存儲(chǔ)和移除Inter1和Inter2類(lèi)型,基于用戶輸入的列表。
java.util.ArrayList inters = new java.util.ArrayList();
我也有一個(gè)重載方法家族,它處理每個(gè)實(shí)現(xiàn)如何相互作用,以及2個(gè)“Inter”的默認(rèn)實(shí)現(xiàn)。
void doSomething(Inter in1, Inter in2){
System.out.println("Inter/Inter");
}
void doSomething(Inter1 in1, Inter1 in2){
System.out.println("Inter1/Inter11");
}
void doSomething(Inter2 in1, Inter1 in2){
System.out.println("Inter2/Inter1");
}
的方法是周期性地調(diào)用像這樣:
for(int i = 0; i < inters.size() - 1; i++){
for(int o = i+1; o < inters.size(); o++){
Inter in1 = inters.get(i); Inter in2 = inters.get(o);
doSomething(in1.getClass().cast(in1), in2.getClass().cast(in2));
System.out.println("Class 1: " + in1.getClass().getName());
System.out.println("Class 2: " + in2.getClass().getName());
}
}
從該輸出的一個(gè)例子是:
Inter/Inter
Class 1: Inter
Class 2: Inter
Inter/Inter
Class 1: Inter
Class 2: Inter1
Inter/Inter
Class 1: Inter1
Class 2: Inter1
綜觀輸出,很顯然,doSomething的(國(guó)際IN1, Inter in2)被調(diào)用,即使在應(yīng)該調(diào)用其他方法的情況下也是如此。有趣的是,輸出的類(lèi)名是正確的。
為什么java在運(yùn)行時(shí)使用反射來(lái)確定類(lèi)類(lèi)型時(shí)有靜態(tài)方法重載? 有什么辦法讓Java來(lái)做到這一點(diǎn)?我知道我可以使用反射和Class.getMethod()和method.invoke()來(lái)獲得我想要的結(jié)果,但是在使用cast的時(shí)候會(huì)更加簡(jiǎn)單。
我意識(shí)到之前已經(jīng)提出過(guò)有關(guān)類(lèi)似概念的問(wèn)題,但所有的答案都是信息性的,沒(méi)有人滿意我。 Double dispatch看起來(lái)好像會(huì)起作用,但這意味著需要重新編寫(xiě)大量的代碼,因?yàn)槲医?jīng)常使用這種類(lèi)型的東西。
2012-03-28
Adno
總結(jié)
以上是生活随笔為你收集整理的android 反射调用方法可不可以重载,使用Java进行反射投射和重载方法调度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c语言电子计算器课程设计报告,计算机程序
- 下一篇: AngualrJS之服务器端通信