Jestem świadomy faktu, że Class#getDeclaredMethods
zwraca deklarowane metody klasy i Class#getMethods
w dodatkowym zawiera dziedziczne metody. W skrócie:Dziwne zachowanie - Klasa # getDeclaredMethods vs getMethods
getDeclaredMethods is subset of getMethods
Ale w jaki sposób uzasadnione jest poniższe wyjście?
class A implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
return -1;
}
private Object baz = "Hello";
private class Bar {
private Bar() {
System.out.println(baz);
}
}
Bar b = new Bar();
}
for (Method m : claz.getDeclaredMethods()) {
System.out.println(m.getName()+ " " + m.isSynthetic());
}
Drukuje:
access$1 synthetic(true)
compare synthetic(false)
compare synthetic(true)
Dla poniżej:
for (Method m : claz.getMethods()) {
System.out.println(m.getName() + " synthetic(" + m.isSynthetic()+")");
}
Drukuje:
compare synthetic(false)
compare synthetic(true)
...//removed others for brievity
Kiedy staramy metod drukowania z A.class
, oprócz widocznych metod zawiera s 2 dodatkowe metody syntetyczne: compare(Object, Object)
(metoda mostkowa) i access$1
(dla Bar
w celu uzyskania dostępu do elementów klasy zewnętrznej Foo
).
Obie zostaną wydrukowane w postaci declaredMethods
. Ale dlaczego nie getMethods
drukuje access$1
?
Jest to również powód, dla którego rachunek "* getDeclaredMethods jest podzbiorem getMethods *" jest ogólnie: ** NOT ** true. Można jedynie powiedzieć, że przecięcie zbioru metod zwróconych przez obie metody jest metodami publicznymi zadeklarowanymi bezpośrednio w odpowiedniej klasie. – Marco13