【问题标题】:Can annotations be nested in a class in Java?注释可以嵌套在Java中的类中吗?
【发布时间】:2013-07-16 12:09:35
【问题描述】:

我试图了解这个注解是如何被@WebMethod 调用的

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService          //<----- is this annotation nested in WebService class
@SOAPBinding(style = Style.RPC)
public interface TimeServer {


    @WebMethod String getTimeAsString();  //<-------is this nested in a class too
    @WebMethod long getTimeAsElapsed();
}

根据我的导入 javax.jws.WebMethod 和 Java 文档
http://docs.oracle.com/javase/7/docs/api/javax/jws/WebMethod.html
public @interface WebMethod 进行了描述。

@WebMethod 注解是否定义为 WebMethod 类?
WebMethod 类的源代码可以是这样的吗?

Public class WebMethod{
   //members
   //methods
  public @interface WebMethod{ //annotation definition in class, is this possible
  }
}

如果不是这样,请用一个简单的例子告诉我它是如何完成的。

【问题讨论】:

  • 外部类是干什么用的?
  • 是嵌套注解的导入 javax.jws.WebMethod
  • 我重复一遍。外部类会完成什么?你还没有回答。

标签: java class interface annotations


【解决方案1】:

不,就像它在您链接到的 Javadoc 中所说的那样,它被定义为

@Retention(value=RUNTIME)
@Target(value=METHOD)
public @interface WebMethod

所以这是您在方法 (@Target(value=METHOD)) 上添加的注释 (@interface)。

@WebMethod 没有“嵌套”到@WebService 中,它们是两个独立的注解(当然,它们协同工作)。一个在方法上,另一个在类上由@Target 定义。

【讨论】:

    【解决方案2】:

    虽然在这个特定实例中似乎并非如此,但我遇到了同样的问题,即内部注释是否可以。

    根据我的实验,这是可行的

    注解定义:

    // pkg2/I.java
    package pkg2;
    
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Retention;
    
    public final class I {
        private I(){
        }
        @Retention(RetentionPolicy.RUNTIME)
        public static @interface Inner {}
    }
    

    用法:

    // pkg/C.java
    package pkg;
    
    import pkg2.I;
    
    @I.Inner
    public class C {
        public static void main(String[] args) throws Exception {
             System.out.println(C.class.getAnnotation(I.Inner.class));
        }
    }
    

    跑步:

    $ java pkg/C
    @pkg2.I$Inner()
    

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2011-10-31
      • 2013-08-20
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2015-01-27
      • 2011-07-12
      • 2011-10-11
      相关资源
      最近更新 更多