Sono consapevole del fatto che, Class#getDeclaredMethods
restituisce metodi dichiarati della classe e Class#getMethods
in ulteriori contiene i metodi ereditati. In breve:Comportamento strano - Classe # getDeclaredMethods vs getMethods
getDeclaredMethods is subset of getMethods
Ma come è giustificata l'uscita di seguito?
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());
}
Esso stampa:
access$1 synthetic(true)
compare synthetic(false)
compare synthetic(true)
Per il seguito:
for (Method m : claz.getMethods()) {
System.out.println(m.getName() + " synthetic(" + m.isSynthetic()+")");
}
Esso stampa:
compare synthetic(false)
compare synthetic(true)
...//removed others for brievity
Quando cerchiamo metodi di stampa di A.class
, a parte i metodi visibili contiene s 2 metodi sintetici aggiuntivi compare(Object, Object)
(metodo bridge) e access$1
(per Bar
per accedere agli elementi della classe esterna).
Entrambi vengono stampati in declaredMethods
. Ma perché lo getMethods
non stampa access$1
?
Questo è anche il motivo per cui la dichiarazione "* getDeclaredMethods è un sottoinsieme di getMethods *" è ** NOT ** true in generale. Si può solo dire che l'intersezione dell'insieme di metodi restituiti da entrambi i metodi sono i metodi pubblici dichiarati direttamente nella rispettiva classe. – Marco13