[英]Can a method in an abstract class use reflection to get information about the instantiating class?
我想知道抽象類中的方法是否可以獲取有關實例化類的信息,例如,構造函數方法的數量和它們采用的參數類型。
此外,我想知道是否有可能知道上述哪一個被要求進行特定的實例化。
謝謝
我想你可以。
package test;
public abstract class AbstractClass {
public abstract String something();
public void printConstructorsOfInstantiatingClass() {
System.out.println(getClass().getDeclaredConstructors());
}
}
package test;
public class ConcreteClass extends AbstractClass {
@Override
public String something() {
return "concreteSomething";
}
}
package test;
public class TestMain {
public static void main(String[] args) {
ConcreteClass cc = new ConcreteClass();
cc.printConstructorsOfInstantiatingClass();
}
}
同樣適用於getDeclaredMethods和其他有關反射的方法。
yep getClass()
返回實例的類對象,包含您需要的所有內容
例如getClass().getConstructors()
返回一個可以調用的構造函數對象數組
但是,除非您了解構造函數內部的代碼,否則無法知道為特定對象調用哪一個
我沒有測試過這個,但我相信如果你在抽象類中實現反射代碼,在運行時你將獲得擴展你的抽象的實際類的信息(如果你使用像this.getClass()這樣的東西。 ..等)。
至於調用哪個構造函數,我不相信它只能使用反射,因為在創建對象之后,沒有記錄之前調用的方法。
正如已經回答的那樣, getClass()
將返回具體類,並且是您正在尋找的。
至於調用哪個構造函數,最好的辦法是拋出一個異常,捕獲它,然后沿堆棧幀向上走,直到找到你正在尋找的構造函數調用。 不太干凈,但我認為這是你能做的最好的。
我相信如果當前類是匿名的或嵌套的,你可以使用getClass().getEnclosingClass()
來獲取父類。 如果這不起作用,請嘗試getClass().getDeclaringClass()
。
使用getConstructors()
查找聲明類的構造函數。 我不認為有任何方法可以確定調用哪個構造函數來實例化聲明類...除非你的代碼在聲明類的構造函數中運行,在這種情況下你可以拋出一個Exception,因為@AndrewEisenberg在他的回復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.