1

次の3つのクラスがあるとします

A.java

public class A {
    public static void main (String[] args) {
        new C();
    }
}

B.java

import java.lang.reflect.Method;
import java.util.Arrays;

public class B {
    public B() {
        Method[] m = this.getClass().getDeclaredMethods();
        System.out.println(Arrays.toString(m));
    }

    public void hello() {

    }
}

C.java

public class C extends B{
    public C() {
        super();
    }
}

そして、クラス A でメイン メソッドを実行します。クラス C をインスタンス化する必要があります。クラス C は、クラス B のコンストラクターを呼び出して、宣言されたメソッドを出力します。出力は[]です。出力が次のようになると予想していたので、これは驚きです (すべてのクラスが というパッケージに含まれていると仮定しますtest)。

[public void test.B.hello()]

それで、何が問題なのですか?そして、これが実際の出力になるようにするにはどうすればよいですか?

4

3 に答える 3

4

getClassインスタンスのクラスを返します。この場合、これはCです。class に宣言されたメソッドがありませんCClass返されたオブジェクトの「getSuperClass」メソッドも使用して、問題を解決できます。

Class c = this.getClass();
while (c != null) {
  System.out.println(Arrays.toString(c.getDeclaredMethods()));
  c = c.getSuperClass();
}
于 2013-02-12T21:15:57.680 に答える
1

ここで重要なのはthis、現在のコンテキストを意味する Thatという単語の使用です。これCは、 is の具体的なサブクラスである場合BですC。メソッドを取得B'sするには、B に到達するまでトラバースする必要があります。これは、おそらくアプリケーション ロジックに依存します。1つの方法は次のとおりです。

import java.lang.reflect.Method;
import java.util.Arrays;

public class B {
    public B() {
        Class<?> parent = getClass();
        while(parent.getSuperclass() != null) {
            if(parent.getSuperclass() != Object.class) {
                parent = parent.getSuperclass();
            } else {
                break;
            }
        }
        Method[] m = parent.getDeclaredMethods();
        System.out.println(Arrays.toString(m));
    }

    public void hello() {

    }
}
于 2013-02-12T21:27:43.930 に答える