1、枚舉類
JDK1.5以前須要自定義枚舉類;JDK 1.5 新增的 enum 關鍵字用於定義枚舉類。若枚舉只有一個成員, 則能夠做爲一種單例模式的實現方式html
1.1 枚舉類的屬性
枚舉類對象的屬性不該容許被改動, 因此應該使用 private final 修飾。
枚舉類的使用 private final 修飾的屬性應該在構造器中爲其賦值。
若枚舉類顯式的定義了帶參數的構造器, 則在列出枚舉值時也必須對應的傳入參數。java
1.2 Enum枚舉類
必須在枚舉類的第一行聲明枚舉類對象。 JDK 1.5 中能夠在 switch 表達式中使用Enum定義的枚舉類的對象做爲表達式, case 子句能夠直接使用枚舉值的名字, 無需添加枚舉類做爲限定。
枚舉類和普通類的區別:
使用 enum 定義的枚舉類默認繼承了 java.lang.Enum 類
枚舉類的構造器只能使用 private 訪問控制符
枚舉類的全部實例必須在枚舉類中顯式列出(, 分隔 ; 結尾). 列出的實例系統會自動添加 public static final 修飾
程序員
1.3 使用 Enum 定義的示例
package org.springframework.http; import org.springframework.lang.Nullable; /** * Enumeration of HTTP status codes. * * <p>The HTTP status code series can be retrieved via {@link #series()}. * * @author Arjen Poutsma * @author Sebastien Deleuze * @author Brian Clozel * @since 3.0 * @see HttpStatus.Series * @see <a href="https://www.iana.org/assignments/http-status-codes">HTTP Status Code Registry</a> * @see <a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes - Wikipedia</a> */ public enum HttpStatus { // 1xx Informational /** * {@code 100 Continue}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.2.1">HTTP/1.1: Semantics and Content, section 6.2.1</a> */ CONTINUE(100, "Continue"), /** * {@code 101 Switching Protocols}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.2.2">HTTP/1.1: Semantics and Content, section 6.2.2</a> */ SWITCHING_PROTOCOLS(101, "Switching Protocols"), /** * {@code 102 Processing}. * @see <a href="https://tools.ietf.org/html/rfc2518#section-10.1">WebDAV</a> */ PROCESSING(102, "Processing"), /** * {@code 103 Checkpoint}. * @see <a href="https://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal">A proposal for supporting * resumable POST/PUT HTTP requests in HTTP/1.0</a> */ CHECKPOINT(103, "Checkpoint"), // 2xx Success /** * {@code 200 OK}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.1">HTTP/1.1: Semantics and Content, section 6.3.1</a> */ OK(200, "OK"), /** * {@code 201 Created}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.2">HTTP/1.1: Semantics and Content, section 6.3.2</a> */ CREATED(201, "Created"), /** * {@code 202 Accepted}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.3">HTTP/1.1: Semantics and Content, section 6.3.3</a> */ ACCEPTED(202, "Accepted"), /** * {@code 203 Non-Authoritative Information}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.4">HTTP/1.1: Semantics and Content, section 6.3.4</a> */ NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"), /** * {@code 204 No Content}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.5">HTTP/1.1: Semantics and Content, section 6.3.5</a> */ NO_CONTENT(204, "No Content"), /** * {@code 205 Reset Content}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.3.6">HTTP/1.1: Semantics and Content, section 6.3.6</a> */ RESET_CONTENT(205, "Reset Content"), /** * {@code 206 Partial Content}. * @see <a href="https://tools.ietf.org/html/rfc7233#section-4.1">HTTP/1.1: Range Requests, section 4.1</a> */ PARTIAL_CONTENT(206, "Partial Content"), /** * {@code 207 Multi-Status}. * @see <a href="https://tools.ietf.org/html/rfc4918#section-13">WebDAV</a> */ MULTI_STATUS(207, "Multi-Status"), /** * {@code 208 Already Reported}. * @see <a href="https://tools.ietf.org/html/rfc5842#section-7.1">WebDAV Binding Extensions</a> */ ALREADY_REPORTED(208, "Already Reported"), /** * {@code 226 IM Used}. * @see <a href="https://tools.ietf.org/html/rfc3229#section-10.4.1">Delta encoding in HTTP</a> */ IM_USED(226, "IM Used"), // 3xx Redirection /** * {@code 300 Multiple Choices}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.1">HTTP/1.1: Semantics and Content, section 6.4.1</a> */ MULTIPLE_CHOICES(300, "Multiple Choices"), /** * {@code 301 Moved Permanently}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.2">HTTP/1.1: Semantics and Content, section 6.4.2</a> */ MOVED_PERMANENTLY(301, "Moved Permanently"), /** * {@code 302 Found}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.3">HTTP/1.1: Semantics and Content, section 6.4.3</a> */ FOUND(302, "Found"), /** * {@code 302 Moved Temporarily}. * @see <a href="https://tools.ietf.org/html/rfc1945#section-9.3">HTTP/1.0, section 9.3</a> * @deprecated in favor of {@link #FOUND} which will be returned from {@code HttpStatus.valueOf(302)} */ @Deprecated MOVED_TEMPORARILY(302, "Moved Temporarily"), /** * {@code 303 See Other}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.4">HTTP/1.1: Semantics and Content, section 6.4.4</a> */ SEE_OTHER(303, "See Other"), /** * {@code 304 Not Modified}. * @see <a href="https://tools.ietf.org/html/rfc7232#section-4.1">HTTP/1.1: Conditional Requests, section 4.1</a> */ NOT_MODIFIED(304, "Not Modified"), /** * {@code 305 Use Proxy}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.5">HTTP/1.1: Semantics and Content, section 6.4.5</a> * @deprecated due to security concerns regarding in-band configuration of a proxy */ @Deprecated USE_PROXY(305, "Use Proxy"), /** * {@code 307 Temporary Redirect}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.4.7">HTTP/1.1: Semantics and Content, section 6.4.7</a> */ TEMPORARY_REDIRECT(307, "Temporary Redirect"), /** * {@code 308 Permanent Redirect}. * @see <a href="https://tools.ietf.org/html/rfc7238">RFC 7238</a> */ PERMANENT_REDIRECT(308, "Permanent Redirect"), // --- 4xx Client Error --- /** * {@code 400 Bad Request}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.1">HTTP/1.1: Semantics and Content, section 6.5.1</a> */ BAD_REQUEST(400, "Bad Request"), /** * {@code 401 Unauthorized}. * @see <a href="https://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a> */ UNAUTHORIZED(401, "Unauthorized"), /** * {@code 402 Payment Required}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.2">HTTP/1.1: Semantics and Content, section 6.5.2</a> */ PAYMENT_REQUIRED(402, "Payment Required"), /** * {@code 403 Forbidden}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.3">HTTP/1.1: Semantics and Content, section 6.5.3</a> */ FORBIDDEN(403, "Forbidden"), /** * {@code 404 Not Found}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a> */ NOT_FOUND(404, "Not Found"), /** * {@code 405 Method Not Allowed}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.5">HTTP/1.1: Semantics and Content, section 6.5.5</a> */ METHOD_NOT_ALLOWED(405, "Method Not Allowed"), /** * {@code 406 Not Acceptable}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.6">HTTP/1.1: Semantics and Content, section 6.5.6</a> */ NOT_ACCEPTABLE(406, "Not Acceptable"), /** * {@code 407 Proxy Authentication Required}. * @see <a href="https://tools.ietf.org/html/rfc7235#section-3.2">HTTP/1.1: Authentication, section 3.2</a> */ PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"), /** * {@code 408 Request Timeout}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.7">HTTP/1.1: Semantics and Content, section 6.5.7</a> */ REQUEST_TIMEOUT(408, "Request Timeout"), /** * {@code 409 Conflict}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.8">HTTP/1.1: Semantics and Content, section 6.5.8</a> */ CONFLICT(409, "Conflict"), /** * {@code 410 Gone}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.9"> * HTTP/1.1: Semantics and Content, section 6.5.9</a> */ GONE(410, "Gone"), /** * {@code 411 Length Required}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.10"> * HTTP/1.1: Semantics and Content, section 6.5.10</a> */ LENGTH_REQUIRED(411, "Length Required"), /** * {@code 412 Precondition failed}. * @see <a href="https://tools.ietf.org/html/rfc7232#section-4.2"> * HTTP/1.1: Conditional Requests, section 4.2</a> */ PRECONDITION_FAILED(412, "Precondition Failed"), /** * {@code 413 Payload Too Large}. * @since 4.1 * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.11"> * HTTP/1.1: Semantics and Content, section 6.5.11</a> */ PAYLOAD_TOO_LARGE(413, "Payload Too Large"), /** * {@code 413 Request Entity Too Large}. * @see <a href="https://tools.ietf.org/html/rfc2616#section-10.4.14">HTTP/1.1, section 10.4.14</a> * @deprecated in favor of {@link #PAYLOAD_TOO_LARGE} which will be * returned from {@code HttpStatus.valueOf(413)} */ @Deprecated REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"), /** * {@code 414 URI Too Long}. * @since 4.1 * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.12"> * HTTP/1.1: Semantics and Content, section 6.5.12</a> */ URI_TOO_LONG(414, "URI Too Long"), /** * {@code 414 Request-URI Too Long}. * @see <a href="https://tools.ietf.org/html/rfc2616#section-10.4.15">HTTP/1.1, section 10.4.15</a> * @deprecated in favor of {@link #URI_TOO_LONG} which will be returned from {@code HttpStatus.valueOf(414)} */ @Deprecated REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"), /** * {@code 415 Unsupported Media Type}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.13"> * HTTP/1.1: Semantics and Content, section 6.5.13</a> */ UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"), /** * {@code 416 Requested Range Not Satisfiable}. * @see <a href="https://tools.ietf.org/html/rfc7233#section-4.4">HTTP/1.1: Range Requests, section 4.4</a> */ REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"), /** * {@code 417 Expectation Failed}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.5.14"> * HTTP/1.1: Semantics and Content, section 6.5.14</a> */ EXPECTATION_FAILED(417, "Expectation Failed"), /** * {@code 418 I'm a teapot}. * @see <a href="https://tools.ietf.org/html/rfc2324#section-2.3.2">HTCPCP/1.0</a> */ I_AM_A_TEAPOT(418, "I'm a teapot"), /** * @deprecated See * <a href="https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt"> * WebDAV Draft Changes</a> */ @Deprecated INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"), /** * @deprecated See * <a href="https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt"> * WebDAV Draft Changes</a> */ @Deprecated METHOD_FAILURE(420, "Method Failure"), /** * @deprecated * See <a href="https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt"> * WebDAV Draft Changes</a> */ @Deprecated DESTINATION_LOCKED(421, "Destination Locked"), /** * {@code 422 Unprocessable Entity}. * @see <a href="https://tools.ietf.org/html/rfc4918#section-11.2">WebDAV</a> */ UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"), /** * {@code 423 Locked}. * @see <a href="https://tools.ietf.org/html/rfc4918#section-11.3">WebDAV</a> */ LOCKED(423, "Locked"), /** * {@code 424 Failed Dependency}. * @see <a href="https://tools.ietf.org/html/rfc4918#section-11.4">WebDAV</a> */ FAILED_DEPENDENCY(424, "Failed Dependency"), /** * {@code 425 Too Early}. * @since 5.2 * @see <a href="https://tools.ietf.org/html/rfc8470">RFC 8470</a> */ TOO_EARLY(425, "Too Early"), /** * {@code 426 Upgrade Required}. * @see <a href="https://tools.ietf.org/html/rfc2817#section-6">Upgrading to TLS Within HTTP/1.1</a> */ UPGRADE_REQUIRED(426, "Upgrade Required"), /** * {@code 428 Precondition Required}. * @see <a href="https://tools.ietf.org/html/rfc6585#section-3">Additional HTTP Status Codes</a> */ PRECONDITION_REQUIRED(428, "Precondition Required"), /** * {@code 429 Too Many Requests}. * @see <a href="https://tools.ietf.org/html/rfc6585#section-4">Additional HTTP Status Codes</a> */ TOO_MANY_REQUESTS(429, "Too Many Requests"), /** * {@code 431 Request Header Fields Too Large}. * @see <a href="https://tools.ietf.org/html/rfc6585#section-5">Additional HTTP Status Codes</a> */ REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"), /** * {@code 451 Unavailable For Legal Reasons}. * @see <a href="https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04"> * An HTTP Status Code to Report Legal Obstacles</a> * @since 4.3 */ UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"), // --- 5xx Server Error --- /** * {@code 500 Internal Server Error}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.1">HTTP/1.1: Semantics and Content, section 6.6.1</a> */ INTERNAL_SERVER_ERROR(500, "Internal Server Error"), /** * {@code 501 Not Implemented}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.2">HTTP/1.1: Semantics and Content, section 6.6.2</a> */ NOT_IMPLEMENTED(501, "Not Implemented"), /** * {@code 502 Bad Gateway}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.3">HTTP/1.1: Semantics and Content, section 6.6.3</a> */ BAD_GATEWAY(502, "Bad Gateway"), /** * {@code 503 Service Unavailable}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.4">HTTP/1.1: Semantics and Content, section 6.6.4</a> */ SERVICE_UNAVAILABLE(503, "Service Unavailable"), /** * {@code 504 Gateway Timeout}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.5">HTTP/1.1: Semantics and Content, section 6.6.5</a> */ GATEWAY_TIMEOUT(504, "Gateway Timeout"), /** * {@code 505 HTTP Version Not Supported}. * @see <a href="https://tools.ietf.org/html/rfc7231#section-6.6.6">HTTP/1.1: Semantics and Content, section 6.6.6</a> */ HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported"), /** * {@code 506 Variant Also Negotiates} * @see <a href="https://tools.ietf.org/html/rfc2295#section-8.1">Transparent Content Negotiation</a> */ VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"), /** * {@code 507 Insufficient Storage} * @see <a href="https://tools.ietf.org/html/rfc4918#section-11.5">WebDAV</a> */ INSUFFICIENT_STORAGE(507, "Insufficient Storage"), /** * {@code 508 Loop Detected} * @see <a href="https://tools.ietf.org/html/rfc5842#section-7.2">WebDAV Binding Extensions</a> */ LOOP_DETECTED(508, "Loop Detected"), /** * {@code 509 Bandwidth Limit Exceeded} */ BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"), /** * {@code 510 Not Extended} * @see <a href="https://tools.ietf.org/html/rfc2774#section-7">HTTP Extension Framework</a> */ NOT_EXTENDED(510, "Not Extended"), /** * {@code 511 Network Authentication Required}. * @see <a href="https://tools.ietf.org/html/rfc6585#section-6">Additional HTTP Status Codes</a> */ NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required"); private final int value; private final String reasonPhrase; HttpStatus(int value, String reasonPhrase) { this.value = value; this.reasonPhrase = reasonPhrase; } /** * Return the integer value of this status code. */ public int value() { return this.value; } /** * Return the reason phrase of this status code. */ public String getReasonPhrase() { return this.reasonPhrase; } /** * Return the HTTP status series of this status code. * @see HttpStatus.Series */ public Series series() { return Series.valueOf(this); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#INFORMATIONAL}. * This is a shortcut for checking the value of {@link #series()}. * @since 4.0 * @see #series() */ public boolean is1xxInformational() { return (series() == Series.INFORMATIONAL); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#SUCCESSFUL}. * This is a shortcut for checking the value of {@link #series()}. * @since 4.0 * @see #series() */ public boolean is2xxSuccessful() { return (series() == Series.SUCCESSFUL); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#REDIRECTION}. * This is a shortcut for checking the value of {@link #series()}. * @since 4.0 * @see #series() */ public boolean is3xxRedirection() { return (series() == Series.REDIRECTION); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}. * This is a shortcut for checking the value of {@link #series()}. * @since 4.0 * @see #series() */ public boolean is4xxClientError() { return (series() == Series.CLIENT_ERROR); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}. * This is a shortcut for checking the value of {@link #series()}. * @since 4.0 * @see #series() */ public boolean is5xxServerError() { return (series() == Series.SERVER_ERROR); } /** * Whether this status code is in the HTTP series * {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR} or * {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}. * This is a shortcut for checking the value of {@link #series()}. * @since 5.0 * @see #is4xxClientError() * @see #is5xxServerError() */ public boolean isError() { return (is4xxClientError() || is5xxServerError()); } /** * Return a string representation of this status code. */ @Override public String toString() { return this.value + " " + name(); } /** * Return the enum constant of this type with the specified numeric value. * @param statusCode the numeric value of the enum to be returned * @return the enum constant with the specified numeric value * @throws IllegalArgumentException if this enum has no constant for the specified numeric value */ public static HttpStatus valueOf(int statusCode) { HttpStatus status = resolve(statusCode); if (status == null) { throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); } return status; } /** * Resolve the given status code to an {@code HttpStatus}, if possible. * @param statusCode the HTTP status code (potentially non-standard) * @return the corresponding {@code HttpStatus}, or {@code null} if not found * @since 5.0 */ @Nullable public static HttpStatus resolve(int statusCode) { for (HttpStatus status : values()) { if (status.value == statusCode) { return status; } } return null; } /** * Enumeration of HTTP status series. * <p>Retrievable via {@link HttpStatus#series()}. */ public enum Series { INFORMATIONAL(1), SUCCESSFUL(2), REDIRECTION(3), CLIENT_ERROR(4), SERVER_ERROR(5); private final int value; Series(int value) { this.value = value; } /** * Return the integer value of this status series. Ranges from 1 to 5. */ public int value() { return this.value; } /** * Return the enum constant of this type with the corresponding series. * @param status a standard HTTP status enum value * @return the enum constant of this type with the corresponding series * @throws IllegalArgumentException if this enum has no corresponding constant */ public static Series valueOf(HttpStatus status) { return valueOf(status.value); } /** * Return the enum constant of this type with the corresponding series. * @param statusCode the HTTP status code (potentially non-standard) * @return the enum constant of this type with the corresponding series * @throws IllegalArgumentException if this enum has no corresponding constant */ public static Series valueOf(int statusCode) { Series series = resolve(statusCode); if (series == null) { throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); } return series; } /** * Resolve the given status code to an {@code HttpStatus.Series}, if possible. * @param statusCode the HTTP status code (potentially non-standard) * @return the corresponding {@code Series}, or {@code null} if not found * @since 5.1.3 */ @Nullable public static Series resolve(int statusCode) { int seriesCode = statusCode / 100; for (Series series : values()) { if (series.value == seriesCode) { return series; } } return null; } } }
1.4 枚舉類
枚舉類的主要方法:
values()方法:返回枚舉類型的對象數組。該方法能夠很方便地遍歷全部的枚舉值。
valueOf(String str):能夠把一個字符串轉爲對應的枚舉類對象。要求字符串必須是枚舉類對象的「名字」。如不是,會有運行時異常。web
1.5 枚舉的方法
1.6 實現接口的枚舉類
和普通 Java 類同樣,枚舉類能夠實現一個或多個接口。若須要每一個枚舉值在調用實現的接口方法呈現出不一樣的行爲方式, 則可讓每一個枚舉值分別來實現該方法。spring
2、註解Annotation
從 JDK 5.0 開始, Java 增長了對元數據(MetaData) 的支持, 也就是 Annotation(註解)。Annotation 其實就是代碼裏的特殊標記, 這些標記能夠在編譯, 類加載, 運行時被讀取, 並執行相應的處理. 經過使用 Annotation, 程序員能夠在不改變原有邏輯的狀況下, 在源文件中嵌入一些補充信息。Annotation 能夠像修飾符同樣被使用, 可用於修飾包,類, 構造器, 方法, 成員變量, 參數, 局部變量的聲明, 這些信息被保存在 Annotation 的 「name=value」 對中。Annotation 能被用來爲程序元素(類, 方法, 成員變量等) 設置元數據。數組
2.1 基本的 Annotation
使用 Annotation 時要在其前面增長 @ 符號, 並把該 Annotation 當成一個修飾符使用。用於修飾它支持的程序元素
三個基本的 Annotation:
@Override: 限定重寫父類方法, 該註釋只能用於方法
@Deprecated: 用於表示某個程序元素(類, 方法等)已過期
@SuppressWarnings: 抑制編譯器警告ide
2.2 自定義 Annotation
定義新的 Annotation 類型使用 @interface 關鍵字。
Annotation 的成員變量在 Annotation 定義中以無參數方法的形式來聲明. 其方法名和返回值定義了該成員的名字和類型。
能夠在定義 Annotation 的成員變量時爲其指定初始值, 指定成員變量的初始值可以使用 default 關鍵字工具
public @interface MyAnnotation{ String name() default "相逢何須曾相識"; }
沒有成員定義的 Annotation 稱爲標記; 包含成員變量的 Annotation 稱爲元數據 Annotation。oop
2.3 提取 Annotation 信息
JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 該接口表明程序中能夠接受註解的程序元素。
當一個 Annotation 類型被定義爲運行時 Annotation 後, 該註釋纔是運行時可見, 當 class 文件被載入時保存在 class 文件中的 Annotation 纔會被虛擬機讀取。
程序能夠調用 AnnotationElement 對象的以下方法來訪問 Annotation 信息。ui
2.4 JDK 的元 Annotation
JDK 的元 Annotation 用於修飾其餘 Annotation 定義;JDK5.0提供了專門在註解上的註解類型,分別是:
Retention
Target
Documented
Inherited
@Retention: 只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 能夠保留多長時間, @Rentention 包含一個 RetentionPolicy 類型的成員變量, 使用 @Rentention 時必須爲該 value 成員變量指定值:
RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的註釋
RetentionPolicy.CLASS: 編譯器將把註釋記錄在 class 文件中. 當運行 Java 程序時, JVM 不會保留註解。 這是默認值
RetentionPolicy.RUNTIME:編譯器將把註釋記錄在 class 文件中. 當運行 Java 程序時, JVM 會保留註釋. 程序能夠經過反射獲取該註釋
@Target: 用於修飾 Annotation 定義, 用於指定被修飾的 Annotation 能用於修飾哪些程序元素. @Target 也包含一個名爲 value 的成員變量.
@Documented: 用於指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔.
定義爲Documented的註解必須設置Retention值爲RUNTIME。
@Inherited: 被它修飾的 Annotation 將具備繼承性.若是某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具備該註解
--------------------------------------
版權聲明:本文爲【PythonJsGo】博主的原創文章,轉載請附上原文出處連接及本聲明。
博主主頁:https://my.oschina.net/u/3375733
本篇文章同步在我的公衆號: