抽象类中的方法可以使用反射来获取有关实例化类的信息吗?

时间:2011-10-14 21:23:02

标签: java

我想知道抽象类中的方法是否可以获取有关实例化类的信息,例如,构造函数方法的数量以及它们所采用的参数类型。

此外,我想知道是否有可能知道上述哪一个被要求进行特定的实例化。

由于

5 个答案:

答案 0 :(得分:2)

我认为你可以。

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和其他有关反射的方法。

答案 1 :(得分:0)

yep getClass()返回具有您需要的所有内容的实例的类对象

例如getClass().getConstructors()返回一个可以调用的构造函数对象数组

然而,除非您对构造函数内部的代码有更多了解,否则无法知道为特定对象调用哪一个

答案 2 :(得分:0)

我没有测试过这个,但我相信如果你在抽象类中实现反射代码,在运行时你将获得扩展你的抽象的实际类的信息(如果你使用像this.getClass这样的东西) ()......等)。

至于调用哪个构造函数,我不相信它只能使用反射,因为在创建对象之后,没有记录之前调用的方法。

答案 3 :(得分:0)

正如已经回答的那样,getClass()将返回具体的类,并且正是您正在寻找的。

关于调用哪个构造函数,最好的办法是抛出一个异常,抓住它,然后沿堆栈帧向上走,直到找到你正在寻找的构造函数调用。不太干净,但我认为这是你能做的最好的。

答案 4 :(得分:0)

我相信如果当前的类是匿名的或嵌套的,你可以使用getClass().getEnclosingClass()来获取父类。如果这不起作用,请尝试getClass().getDeclaringClass()

使用getConstructors()查找声明类的构造函数。我不认为有任何方法可以确定调用哪个构造函数来实例化声明类...除非你的代码在声明类的构造函数中运行,在这种情况下你可以抛出一个Exception,因为@AndrewEisenberg在他的回复。