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;
}
}