1

簡潔にするために短縮された次の API コードがあります。

public class Vec
{
    Vec(int x, int y, int z) {/*implementation*/}
    //other fields and methods irrelevant to question and not shown
}

今、リフレクションを使用してそのクラスのコンストラクターを呼び出し、その新しいインスタンスを作成する、上記のクラスとは異なるパッケージにコードを記述しようとしています。これが私が試したことです(以下のコードは私のアプリケーションのmainメソッドにあります):

Constructor<Vec> c = Vec.class.getConstructor(Integer.TYPE, Integer.TYPE, Integer.TYPE);
c.setAccessible(true);
Vec newVec = c.newInstance(1, 2, 3);

ただし、上記のコードを実行すると、後者のコードの最初の行で例外が発生します。

Exception in thread "main" java.lang.NoSuchMethodException: somePackages.Vec.<init>(int, int, int)

そのコンストラクターがまだ存在しているのに、なぜまだその例外を与えているのですか? oracle-java8-jdk役立つ場合は、Raspberry Piを使用してこのコードを実行しています。

4

1 に答える 1

7

Class#getConstructor(Object...)javadoc 状態

このオブジェクト によって表されるクラスConstructorの指定されたコンストラクターを反映するオブジェクトを返しますpublicClass

あなたのコンストラクターは ではありませんpublic。アクセス修飾子がないため、パッケージ プライベートです。

を使用しgetDeclaredConstructor(Object...)ます。

于 2014-08-04T03:17:17.470 に答える