Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名内部类的访问类型是什么?_Java_Anonymous Inner Class - Fatal编程技术网

Java 匿名内部类的访问类型是什么?

Java 匿名内部类的访问类型是什么?,java,anonymous-inner-class,Java,Anonymous Inner Class,我一直在考虑类,特别是匿名内部类。这让我想知道匿名内部类的访问类型是什么 我意识到在大多数情况下,这不会改变任何事情,但它可能会对反射产生影响。我看到过几个问题,关于在使用反射访问匿名内部类的内容时遇到问题 我确实发现了这个问题(这个问题的一个例子): 这个答案表明这是私人的,但作者无法证实: 看起来它们是公共的,但是JDK的Method.invoke实现有一个(长期运行的)bug。看 链接的bug并不真正符合我们的情况,但是它聚合了所有类型的方法。调用内部类的访问控制问题,并被标记为重复,在

我一直在考虑类,特别是匿名内部类。这让我想知道匿名内部类的访问类型是什么

我意识到在大多数情况下,这不会改变任何事情,但它可能会对反射产生影响。我看到过几个问题,关于在使用反射访问匿名内部类的内容时遇到问题

我确实发现了这个问题(这个问题的一个例子):

这个答案表明这是私人的,但作者无法证实:

看起来它们是公共的,但是JDK的Method.invoke实现有一个(长期运行的)bug。看


链接的bug并不真正符合我们的情况,但是它聚合了所有类型的方法。调用内部类的访问控制问题,并被标记为重复,在您提到的SO问题的公认答案中链接了。

类本身似乎有外部类的包

getModifiers()
值为
8
,根据注释为:
静态,包私有

它的
静态
(为什么?)。我无法从
Main
中的匿名类内部引用
Main

它的
包是私有的
。尽管如此,匿名类的访问级别并没有多大意义,因为您不能像普通类一样在编译时使用它的类型


哇,
提交日期:1997-08-14
(!!)是的,看起来他们自java 1.1以来就想更改类文件格式,这将有助于解决此问题。它在2014年进行了更新,所以也许他们没有完全放弃做这件事的所有希望……我认为你引用的问题并没有对课程本身产生太大的影响。这个错误是由于一个bug引起的,这个bug是关于方法的可访问性,而不是类。类本身不是成员,因此“访问”它是没有意义的。@assylias谢谢。再次测试,anon类和外部类有相同的包。我认为它只是静态的,因为它是在静态方法中声明的。在任何其他方法中,它都不会是静态的。至于它是“包私有的”-它实际上只是默认值,被解释为“包私有的”。但对于一个既不是成员也不是顶级的类来说,这是毫无意义的。
// JDK 8
import java.lang.reflect.Modifier;

public class Main {
    public static void main(String[] args) throws Exception {
        Class anon = new Main() {}.getClass();

        System.out.println("Name:" + anon.getName()); // Main$1
        System.out.println("Anonymous:" + anon.isAnonymousClass()); // true
        System.out.println("Package:" + anon.getPackage()); // null

        System.out.println("public ? " + Modifier.isPublic(anon.getModifiers())); // false
        System.out.println("private ? " + Modifier.isPrivate(anon.getModifiers())); // false
        System.out.println("protected ? " + Modifier.isProtected(anon.getModifiers())); // false

        assert anon.newInstance() instanceof Main;
        assert Class.forName(anon.getName()).newInstance() instanceof Main;
    }
}