注释匿名内部类

43

在Java中是否有一种方法可以为匿名内部类添加注释?

在这个例子中,你能否为Class2添加一个类级别的注释?

public void method1() {
  add(new Class2() {
    public void method3() {}
  });
}
3个回答

37

不行。您需要将其提升为“适当”的类。如果必要,它仍然可以在外部类中进行作用域限定,因此它不需要成为顶级类、公共类或任何其他类型的类。但是,它确实需要一个适当的类定义来附加注释。


3
“proper”类甚至可以在方法内被定义,这样它的范围就局限于该方法内部,并且从设计上来说,它仍然是该方法的一个内部实现细节。 - amichair
1
如果您对@amichair关于本地类的描述感到惊讶(就像我一样),请注意它是JDK8中的新功能,文档在此处:https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html。 - Ben Page
显然,本地类自Java 1.1以来就存在了...但它们仍然让人惊讶 :-) - amichair
1
请注意,自Java 8以来,您也可以向匿名类添加类级别注释,请参见下面的此答案 - Qw3ry

19
是的,正如yegor256所提到的, 可能性是存在的,因为JDK 8采用了JSR 308(类型注释)
因此,现在每当一个注释被@Target({ElementType.TYPE_USE})修饰时,它可以在运行时用于注释匿名类。例如:
@Target({ ElementType.TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String value();
}

Object o = new @MyAnnotation("Hello") Object() {};

棘手的部分是如何访问注释:

    Class<?> c = o.getClass();
    AnnotatedType type = c.getAnnotatedSuperclass();
    System.out.println(Arrays.toString(type.getAnnotations()));   

有没有关于如何访问这些注释的文档?我找不到官方文档,需要使用 o.getClass().getAnnotatedSuperclass().getAnnotations() 访问它们,这对我来说似乎很奇怪和违反直觉。 - Qw3ry
我认为“TYPE_USE”注解并不是OP所问的内容。问题是如何将“TYPE”注解附加到普通类定义上。 - Aleksandr Dubinsky
@AleksandrDubinsky 我认为OP并不是在询问“TYPE”注释。这个问题是关于匿名类和任何可能的注释。 - jan.supol

11

目前还没有。这个特性是由JSR 308提出的,可能会在未来的Java版本中包含。


8
你可以加上一个明确的“不”字,否则你的回答会导致心理页面错误。 - Adam Arold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接