1

我有 2 类 A 类和 B 类,其中Class A extends Class B

现在在 Class 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);
}

我想使用反射来调用超类方法ClassBMethod,我创建了一个超类的实例来这样做

Class superClazz = Class.forName(classInstance.getClass().getSuperclass().getName());
Constructor superClassconstructor = superClazz.getConstructor(new Class[]{Integer.class});
Object superclassInstance = superClassconstructor.newInstance(integerParam);

问题在于,Super 类的实例被创建了两次,一次通过 A 类构造函数,第二次通过反射。

如何在不创建实例的情况下调用避免这种情况并调用 Super 类方法

4

3 回答 3

3

每当调用一个类的构造函数时,都会调用其超类的构造函数,然后调用层次结构中上一层类的构造函数Object。没有办法避免这种情况。

于 2013-01-23T09:56:24.367 回答
1

我不是 100% 确定,但我认为你可能想要这样做......

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(不是苹果本身),你给了一些重量。所以基本上你所拥有的是一个重量不详的苹果和另一个重量不详的水果。由于其他水果是在构造函数中声明的,所以一旦构造函数完成,其他水果就会消失。唯一剩下的是一个未指定重量的苹果(或默认构造函数指定的默认重量)。

于 2013-01-23T10:05:52.490 回答
0

您可以在 A 类中写:super.ClassBMethod()

如果您需要使用反射(这是一项家庭作业吗?),请遵循 Alderath 的答案。我只会在那里简化一行:

Class superClazz =classInstance.getClass().getSuperclass()

要不就

Class superClazz = B.class;
于 2013-01-23T10:11:43.267 回答