反射中的SuperClass构造函数问题

时间:2013-01-23 09:53:26

标签: java

我有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类方法

3 个答案:

答案 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;