繁体   English   中英

注释可以嵌套在Java类中吗?

[英]Can annotations be nested in a class in Java?

我正在尝试了解如何调用此批注@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
  }
}

如果不是这种情况,请让我通过一个简单的示例完成它。

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

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

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

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

虽然在这种特定情况下似乎并非如此,但我遇到了相同的问题,即内部注释是否可以正常使用。

根据我的实验,这有效

注释定义:

// 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM