リフレクションを使用しているときに興味深いものが見つかりました。私は単純なクラスとその修飾子のコンストラクタを取得しようとしました。ここで予期しない "一時的な"コンストラクタの修飾子
public class Test {
public Test(Object... args) {}
}
はコンストラクタ修飾子を取得するためのコードです:
Class<?> clazz = Test.class;
Constructor<?>[] ctors = clazz.getDeclaredConstructors();
for (Constructor<?> ctor : ctors) {
int mod = ctor.getModifiers();
/*if not package-private modifier*/
if(mod!=0) {
System.out.println(Modifier.toString(mod)));
}
}
結果は次のとおりです。私は変数ではないパラメータが、ちょうど配列をコンストラクタに渡すと
public transient
、それは大丈夫です。
public class Test {
public Test(Object[] args) {}
}
結果は:
public
同じに関係なく、コンストラクタ剤(パブリック、保護、プライベート)またはパラメータタイプ(プリミティブまたは参照)の起こります。どのようにすることができますが、 "一時的な"コンストラクタの有効な修飾子ではないのですか?
これは 'toString'メソッドのバグとしてカウントされますか? –
@JanDvorak:わかりません。物事が進むにつれ、 'Modifier'クラスはJVM仕様で定義されている修飾子のサブセットを扱うことができます(同じビット値を持つ修飾子を区別することはできません)。 – NPE
私は疑問に思っています - 実際にビット値が衝突するのはなぜですか? JVM開発者からの監視ではありませんか? –