奇怪的行为 - Class#getDeclaredMethods vs getMethods

Jat*_*tin 5 java reflection

我知道这样的事实,Class#getDeclaredMethods返回类的声明方法,Class#getMethods另外还包含继承的方法.简而言之:

getDeclaredMethods is subset of getMethods
Run Code Online (Sandbox Code Playgroud)

但是下面的输出如何合理呢?

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());
}
Run Code Online (Sandbox Code Playgroud)

它打印:

access$1 synthetic(true)
compare synthetic(false)
compare synthetic(true)
Run Code Online (Sandbox Code Playgroud)

对于以下内容:

for (Method m : claz.getMethods()) {
    System.out.println(m.getName() + " synthetic(" + m.isSynthetic()+")" );
}
Run Code Online (Sandbox Code Playgroud)

它打印:

compare synthetic(false)
compare synthetic(true)
...//removed others for brievity
Run Code Online (Sandbox Code Playgroud)

当我们尝试打印方法时A.class,除了可见方法之外,它还包含2个额外的合成方法compare(Object, Object)(桥接方法)和access$1(用于Bar访问外部类的元素Foo).

两者都打印出来declaredMethods.但为什么不getMethods打印access$1

ass*_*ias 4

access$1不是公开的 - 您可以通过打印来验证它Modifier.isPublic(m.getModifiers())

getMethods() 只显示公共方法

返回一个包含 Method 对象的数组,该对象反映了该类的所有公共成员方法 [...]

  • 这也是为什么“*getDeclaredMethods 是 getMethods* 的子集”这一说法通常 **不** 成立的原因。只能说这两个方法返回的一组方法的交集是直接在各自的类中声明的公共方法。 (5认同)