簡體   English   中英

抽象類中的方法可以使用反射來獲取有關實例化類的信息嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM