我想知道抽象类中的方法是否可以获取有关实例化类的信息,例如,构造函数方法的数量以及它们所采用的参数类型。
此外,我想知道是否有可能知道上述哪一个被要求进行特定的实例化。
由于
答案 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()
将返回具体的类,并且正是您正在寻找的。 p>
关于调用哪个构造函数,最好的办法是抛出一个异常,抓住它,然后沿堆栈帧向上走,直到找到你正在寻找的构造函数调用。不太干净,但我认为这是你能做的最好的。
答案 4 :(得分:0)
我相信如果当前的类是匿名的或嵌套的,你可以使用getClass().getEnclosingClass()
来获取父类。如果这不起作用,请尝试getClass().getDeclaringClass()
。
使用getConstructors()
查找声明类的构造函数。我不认为有任何方法可以确定调用哪个构造函数来实例化声明类...除非你的代码在声明类的构造函数中运行,在这种情况下你可以抛出一个Exception,因为@AndrewEisenberg在他的回复。