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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注释可以嵌套在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

所以这是一个注释(@interface),你放在一个方法(@Target(value = METHOD))。

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

以上是关于注释可以嵌套在Java中的类中吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的main和constructor可以放在一个类中吗

Java中main方法必须写在public类中吗

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

Java核心基础知识——Java 中的嵌套类

Java核心基础知识——Java 中的嵌套类

扩展片段的类中的选项卡