2014-05-24 8 views
5

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?

Odpowiedz

4

access$1 nie jest publiczny - można go zweryfikować, drukując Modifier.isPublic(m.getModifiers()).

getMethods()only shows public methods:

Zwraca tablicę zawierającą obiekty Method odzwierciedlające wszystkie publicznych metod Poseł do klasy [...]

+5

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