1

クラスAとクラスBの2つのクラスがあります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);
}

リフレクションを使用してスーパー クラス メソッド ClassBMethod を呼び出したいので、このようにスーパー クラスのインスタンスを作成します。

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

ここでの問題は、スーパー クラスのインスタンスが 2 回作成されていることです。

これを回避し、インスタンスを作成せずにスーパークラスメソッドを呼び出すにはどうすればよいですか

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

つまり、私の理解が正しければ、コンストラクターを 2 回呼び出す必要はありませんか? 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これに someWeight を指定します。したがって、基本的には、重量が指定されていないリンゴと、重量が不明な別の果物です。もう一方の果実はコンストラクター内で宣言されているため、コンストラクターが終了するとすぐに、もう一方の果実は消えます。残るのは、重みが指定されていない (または既定のコンストラクターによって既定の重みが指定された) リンゴだけです。

于 2013-01-23T10:05:52.490 に答える
0

クラス A: に書くだけですsuper.ClassBMethod()

リフレクションを使用する必要がある場合 (それは在宅ワークですか?)、Alderath の回答に従ってください。そこの1行だけを単純化します:

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

あるいは単に

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