0

クラス構造の順序は、リフレクションで異なる結果を返しますか?

リフレクションの使用に問題があります。次に例を示します。

public class A{
    public A()
    {
        do something here
    }
    public A(int i)
    {
        do something here
    }
}

次に、別のクラスで、リフレクションを使用して getConstructors() メソッドでコンストラクターを取得します。しかし、ここに問題があります。パラメーターを持つコンストラクターのみを返します。

そこで、コードを修正し、コンストラクトの順序を次のように変更しました。

public class A{
    public A(int i)
    {
        do something here
    }
    public A()
    {
        do something here
    }

}

次に、2 つのコンストラクターを正しく返します。

もう 1 つの興味深い点は、OpenJDK は 2 つの例で問題なく動作しますが、Sun JDK はそうではありません。そして、私はこのような多くのクラスを持っています.SunJDKはそれらのいくつかで正常に動作し、他のクラスでは正しく動作しません. 非常に奇妙な。

何らかの理由?

編集:これは大きなプロジェクトです。ここにリフレクションのコードがあります

Constructor<?>[] constructors = handlerClass.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
    Class<?>[] parameterTypes = constructor.getParameterTypes();

System.out.println("- " + constructor.toString());

    if (nonConnection == true && parameterTypes.length == 0) {
        return constructor;
    } else if (parameterTypes.length > 1) {
        continue;
    } else if (parameterTypes.length == 1) {
        Class<?> parameterType = parameterTypes[0];
        if (TableManipulator.class.isAssignableFrom(parameterType))
        {
            return constructor;
        }
    }
}

handlerClass は、コンストラクターを取得するクラスです。

ps。バイトコードを見てみましたが、バイトコードはコンストラクターの順序を除いて同じです。

編集: getParameterTypes() の後にコンストラクターを表示する System.out を追加しました。コンストラクターは 1 つだけ表示されます....古い順序で表示されますが、新しい順序でコンストラクターが 2 つ表示されます。

4

1 に答える 1

2

あなたが持っている場合

public class A{
    private /* or non-public */ A()
    {
        do something here
    }
    public A(int i)
    {
        do something here
    }
}

getConstructors を使用すると、2 番目のものだけが表示されます。

getDeclaredConstructors()を使用すると、それらすべてを取得できます。この方法を試して、問題が解決するかどうかを確認します。


編集:あなたが持っていないことを確認します

public class A {
    public A A() // not a constructor
    {
         // do something
    }
    public void A() // not a constructor
    {
         // do something
    }
}

削除できますnonConnectionか? これが false の場合、既定のコンストラクターは返されません。

于 2012-06-11T11:11:01.027 に答える