2014-05-24 13 views
5

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?

risposta

4

access$1 non è pubblico: è possibile verificarlo stampando Modifier.isPublic(m.getModifiers()).

getMethods()only shows public methods:

restituisce un array contenente oggetti Method che riflettono tutti i pubblici metodi membro della classe [...]

+5

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