Znalazłem interesującą rzecz podczas pracy z refleksją. Próbowałem pobrać konstruktory prostej klasy i ich modyfikatory.Nieoczekiwany "przejściowy" modyfikator konstruktora
public class Test {
public Test(Object... args) {}
}
Oto kod, aby pobrać modyfikatory Konstruktor:
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)));
}
}
Wynikiem jest:
public transient
Gdybym przekazać do konstruktora nie zmiennych parametrów, ale tylko tablica, to w porządku.
public class Test {
public Test(Object[] args) {}
}
Wynikiem jest:
public
To samo dzieje się niezależnie z konstruktora modyfikatora (publiczne, chronione prywatny) lub parametrów typu (pierwotne lub odniesienie). Jak to możliwe, podczas gdy "przejściowy" nie jest poprawnym modyfikatorem dla konstruktora?
Czy to się liczy jako błąd metody 'toString'? –
@JanDvorak: Nie jestem pewien. W obecnej sytuacji wydaje się, że klasa "Modifier" jest w stanie poradzić sobie z podzestawem modyfikatorów zdefiniowanych w specyfikacji JVM (ponieważ nie jest w stanie odróżnić modyfikatorów o tej samej wartości bitowej). – NPE
Zastanawiam się - dlaczego wartości bitów rzeczywiście zderzają się? Czy to nie jest niedopatrzenie od twórców JVM? –