我有2个班A班和A班B类Class A extends Class B
现在在A类的构造函数中,我有
Class A(Integer integerParam){
B superclass = new B(integerParam);
}
,B类的构造函数为
Class B(Integer integerParam) {
System.out.println(integerParam);
}
除此之外,我在B组中有一些方法如下
public void ClassBMethod(){
System.out.println(integerParam);
}
我想使用反射来调用Super Class方法ClassBMethod,我创建了一个Super类实例,就像这样做
Class superClazz = Class.forName(classInstance.getClass().getSuperclass().getName());
Constructor superClassconstructor = superClazz.getConstructor(new Class[]{Integer.class});
Object superclassInstance = superClassconstructor.newInstance(integerParam);
问题在于,Super类的实例被创建了两次,一次是通过A类构造函数,另一次是反射。
如何在不创建实例
的情况下调用避免此方法并调用Super类方法答案 0 :(得分:3)
每当调用类的构造函数时,都会调用其超类的构造函数,然后调用上层类的构造函数,直到Object
。没有办法避免这种情况。
答案 1 :(得分:2)
我不是百分百肯定,但我认为你可能想要这样做......
A classInstance= new A(42);
Class superClazz = Class.forName(classInstance.getClass().getSuperclass().getName()); // or just superClazz = classInstance.getClass().getSuperClass();
Method classBMethod = superClazz.getMethod("classBMethod");
classBMethod.invoke(classInstance); // Invoke classBMethod on existing instance, without using any constructor reflectively
换句话说,如果我理解正确,你不想要两次调用构造函数?您想在现有实例上调用classBMethod()
吗?
此外,A的构造函数看起来很奇怪。从构造函数的签名来看,感觉A构造函数最有意义:
public A(Integer integerParam){
super(integerParam);
}
对此的解释:
让我们将A类和B类与更具体的对象进行比较:
class A <--> class Apple
class B <--> class Fruit
Integer integerParameter <--> double weight
如果你正在做构造函数:
public Apple(double weight){
super(weight);
}
你很重要的是,当你创建一个苹果(new Apple(someWeight);
)时,苹果就是一个重量为== someWeight的水果。
如果你这样做:
public Apple(double weight){
Fruit b = new Fruit(weight);
}
这意味着:当你打电话给new Apple(someWeight)
时,你会创建一个不同的水果b
(而不是苹果本身)。所以你所拥有的基本上是一个苹果的重量不详,另一个未知的水果重量有些重量。由于其他水果是在构造函数中声明的,一旦构造函数完成,其他水果就会消失。剩下的唯一一件事是苹果具有未指定的重量(或默认重量由默认构造函数指定)。
答案 2 :(得分:1)
你可以写A类:super.ClassBMethod()
。
如果你需要使用反射(它是家庭作业吗?),那么 按照Alderath的回答。我只会在那里简化一行:
Class superClazz =classInstance.getClass().getSuperclass()
或只是
Class superClazz = B.class;