java呼叫祖父類裡被父類重寫了的例項方法
阿新 • • 發佈:2019-02-09
java.lang.invoke
包主要用於動態確定目標方法
在java語言中無法把函式作為一種引數進行傳遞,C++
裡有函式指標,C#
裡有相似的delegate、event型別。在java
裡普遍的做法是傳遞1個實現了某個介面例項作為引數。
MethodHandle
可以讓java語言擁有跟函式指標類似的工具
public class AncestorsRelation {
class Grandfather{
public void say(){
System.out.println("It's grandfather said!");
}
}
class Father extends Grandfather{
public void say(){
System.out.println("It's father said!");
}
}
class Son extends Father{
public void say(){
//如何在此處呼叫Grandfather的say方法
//方法1:
//new Grandfather().say();
//方法2:
//使用MethodHandle呼叫Grandfather的建構函式後再呼叫say方法
}
}
}
第二種方法實現如下
public void say(){
System.out.println("It's son said!");
//使用MethodType構造出要呼叫方法的返回型別
MethodType methodType = MethodType.methodType(void.class);
try {
//找到祖父類的建構函式
MethodHandle inithandle = MethodHandles.lookup().findConstructor(Grandfather.class, methodType);
//獲取祖父類例項物件
Object o = inithandle.invoke();
//找到祖父類裡被覆寫的方法並把該方法繫結到祖父類例項上
MethodHandle handle = MethodHandles.lookup()
.findVirtual(Grandfather.class, "say", methodType).bindTo(o);
//呼叫祖父類裡被父類覆寫的方法
handle.invoke();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}