Chú thích được sử dụng trong Java như thế nào và ở đâu?


218

Các lĩnh vực chính mà chúng ta có thể sử dụng chú thích là gì? Là tính năng thay thế cho cấu hình dựa trên XML?


2
cdb, tôi không chắc bạn hoàn toàn hiểu ý tưởng về tiền thưởng - bạn có một loạt các câu trả lời khá hay ở đây, và không có bất kỳ sự làm rõ nào về những gì còn thiếu từ họ hoặc những gì bạn đang tìm kiếm cụ thể, bạn đã thêm một tiền thưởng. (Bạn cũng đã làm điều này ở đây: stackoverflow.com/questions/1746550/... )
delfuego

5
Được rồi, tôi biết điều này là siêu cũ, nhưng @delfuego: nếu bạn nói với OP rằng anh ta sử dụng tiền thưởng không chính xác, có thể giúp theo dõi bằng cách giải thích cách sử dụng chúng một cách chính xác .
Pops

Câu trả lời:


308

Chú thích là các siêu đối tượng meta có thể được sử dụng để mô tả các siêu đối tượng khác . Các siêu đối tượng là các lớp, các trường và các phương thức. Yêu cầu một đối tượng cho siêu đối tượng của nó (ví dụ anObj.getClass()) được gọi là hướng nội . Phần hướng nội có thể đi xa hơn và chúng ta có thể hỏi một siêu đối tượng chú thích của nó là gì (ví dụ aClass.getAnnotations). Hướng nội và chú thích thuộc về cái được gọi là phản xạlập trình meta .

Một chú thích cần được diễn giải theo cách này hay cách khác để có ích. Các chú thích có thể được diễn giải tại thời điểm phát triển bởi IDE hoặc trình biên dịch hoặc tại thời điểm chạy bởi một khung công tác.

Xử lý chú thích là một cơ chế rất mạnh và có thể được sử dụng theo nhiều cách khác nhau:

  • để mô tả các ràng buộc hoặc việc sử dụng một phần tử: vd @Deprecated, @Override, hoặc@NotNull
  • để mô tả "bản chất" của một yếu tố, vd @Entity, @TestCase, @WebService
  • để mô tả hành vi của một yếu tố: @Statefull, @Transaction
  • để mô tả cách xử lý phần tử: @Column, @XmlElement

Trong mọi trường hợp, một chú thích được sử dụng để mô tả thành phần và làm rõ ý nghĩa của nó .

Trước JDK5, thông tin hiện được thể hiện bằng các chú thích cần được lưu trữ ở một nơi khác và các tệp XML thường được sử dụng. Nhưng việc sử dụng các chú thích sẽ thuận tiện hơn vì chúng sẽ thuộc về chính mã Java và do đó dễ thao tác hơn XML.

Sử dụng các chú thích:

  • Tài liệu, ví dụ XDoclet
  • Biên soạn
  • Ý tưởng
  • Khung kiểm tra, ví dụ JUnit
  • IoC container, ví dụ như mùa xuân
  • Tuần tự hóa, ví dụ XML
  • Lập trình hướng theo khía cạnh (AOP), ví dụ Spring AOP
  • Máy chủ ứng dụng, ví dụ: EJB container, Dịch vụ web
  • Ánh xạ quan hệ đối tượng (ORM), ví dụ Hibernate, JPA
  • và nhiều thứ khác nữa...

... Hãy xem ví dụ tại dự án Lombok , sử dụng các chú thích để xác định cách tạo equalshoặc hashCodephương thức.


50

Có các ứng dụng đa dạng cho các chú thích của Java. Trước hết, chúng có thể được sử dụng bởi trình biên dịch (hoặc phần mở rộng trình biên dịch). Ví dụ, xem xét chú thích ghi đè :

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

Cái này thực sự được tích hợp vào Java JDK. Trình biên dịch sẽ báo hiệu một lỗi, nếu một số phương thức được gắn thẻ với nó, nó không ghi đè lên một phương thức được kế thừa từ một lớp cơ sở. Chú thích này có thể hữu ích để tránh lỗi phổ biến, trong đó bạn thực sự có ý định ghi đè một phương thức, nhưng không thực hiện được, vì chữ ký được đưa ra trong phương thức của bạn không khớp với chữ ký của phương thức bị ghi đè:

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

Kể từ JDK7, các chú thích được cho phép trên bất kỳ loại nào. Tính năng này hiện có thể được sử dụng cho các chú thích của trình biên dịch, chẳng hạn như NotNull , như trong:

public void processSomething(@NotNull String text) {
    ...
}

cho phép trình biên dịch cảnh báo bạn về việc sử dụng biến và giá trị null không đúng .

Một ứng dụng nâng cao hơn khác cho các chú thích liên quan đến phản xạ và xử lý chú thích trong thời gian chạy. Đây là (tôi nghĩ) những gì bạn đã nghĩ trong đầu khi bạn nói về các chú thích là "thay thế cho cấu hình dựa trên XML". Đây là loại xử lý chú thích được sử dụng, ví dụ, theo các khung và tiêu chuẩn JCP khác nhau (kiên trì, tiêm phụ thuộc, bạn đặt tên cho nó) để cung cấp thông tin cấu hình và dữ liệu meta cần thiết.


18

Chú thích là một dạng siêu dữ liệu (dữ liệu về dữ liệu) được thêm vào tệp nguồn Java. Chúng được sử dụng chủ yếu bởi các khung để đơn giản hóa việc tích hợp mã máy khách. Một vài ví dụ trong thế giới thực ngoài đỉnh đầu của tôi:

  • JUnit 4 - bạn thêm @Testchú thích vào mỗi phương thức kiểm tra mà bạn muốn trình chạy JUnit chạy. Ngoài ra còn có các chú thích bổ sung để thiết lập thử nghiệm (như @Before@BeforeClass). Tất cả những điều này được xử lý bởi người chạy JUnit, chạy các bài kiểm tra tương ứng. Bạn có thể nói đó là sự thay thế cho cấu hình XML, nhưng các chú thích đôi khi mạnh hơn (ví dụ chúng có thể sử dụng sự phản chiếu) và chúng cũng gần với mã mà chúng đang tham chiếu hơn ( @Testchú thích nằm ngay trước phương thức thử nghiệm, vì vậy mục đích của phương pháp đó là rõ ràng - cũng là tài liệu). Mặt khác, cấu hình XML có thể phức tạp hơn và có thể bao gồm nhiều dữ liệu hơn các chú thích có thể.

  • Terracotta - sử dụng cả chú thích và tệp cấu hình XML. Ví dụ, @Rootchú thích cho thời gian chạy Terracotta rằng trường chú thích là gốc và bộ nhớ của nó phải được chia sẻ giữa các phiên bản VM. Tệp cấu hình XML được sử dụng để định cấu hình máy chủ và báo cho nó biết lớp nào sẽ sử dụng.

  • Google Guice - một ví dụ sẽ là @Injectchú thích, khi được áp dụng cho hàm tạo sẽ khiến bộ thực thi Guice tìm giá trị cho từng tham số, dựa trên các kim phun được xác định. Các @Injectchú thích sẽ là khá khó khăn để tái sử dụng file cấu hình XML, và gần với các nhà xây dựng nó tham chiếu tới là khá hữu ích (tưởng tượng phải tìm kiếm vào một tập tin XML khổng lồ để tìm tất cả các tiêm phụ thuộc bạn đã thiết lập).

Hy vọng rằng tôi đã cho bạn một hương vị về cách các chú thích được sử dụng trong các khung khác nhau.


12

Các chú thích trong Java, cung cấp một ý nghĩa để mô tả các lớp, các trường và các phương thức. Về cơ bản, chúng là một dạng siêu dữ liệu được thêm vào tệp nguồn Java, chúng không thể ảnh hưởng trực tiếp đến ngữ nghĩa của chương trình. Tuy nhiên, các chú thích có thể được đọc vào thời gian chạy bằng Reflection & quá trình này được gọi là Introspection. Sau đó, nó có thể được sử dụng để sửa đổi các lớp, trường hoặc phương thức.

Tính năng này, thường được Thư viện & SDK khai thác (hibernate, JUnit, Spring Framework) để đơn giản hóa hoặc giảm số lượng mã mà lập trình viên sẽ làm trừ khi làm việc với orer để làm việc với các Thư viện hoặc SDK này. Phản ánh làm việc tay trong Java.

Chúng tôi cũng có thể giới hạn tính khả dụng của một chú thích trong thời gian biên dịch hoặc thời gian chạy.Below là một ví dụ đơn giản về việc tạo một chú thích tùy chỉnh

Driver.java

package io.hamzeen;

import java.lang.annotation.Annotation;

public class Driver {

    public static void main(String[] args) {
        Class<TestAlpha> obj = TestAlpha.class;
        if (obj.isAnnotationPresent(IssueInfo.class)) {

            Annotation annotation = obj.getAnnotation(IssueInfo.class);
            IssueInfo testerInfo = (IssueInfo) annotation;

            System.out.printf("%nType: %s", testerInfo.type());
            System.out.printf("%nReporter: %s", testerInfo.reporter());
            System.out.printf("%nCreated On: %s%n%n",
                    testerInfo.created());
        }
    }
}

TestAlpha.java

package io.hamzeen;

import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {

}

Vấn đềInfo.java

package io.hamzeen;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Hamzeen. H.
 * @created 10/01/2015
 * 
 * IssueInfo annotation definition
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {

    public enum Type {
        BUG, IMPROVEMENT, FEATURE
    }

    Type type() default Type.BUG;

    String reporter() default "Vimesh";

    String created() default "10/01/2015";
}

6

Nó có phải là sự thay thế cho cấu hình dựa trên XML không?

Không hoàn toàn, nhưng sự hợp nhất tương ứng chặt chẽ với các cấu trúc mã (như ánh xạ JPA hoặc tiêm phụ thuộc trong Spring) thường có thể được thay thế bằng các chú thích, và sau đó thường ít dài dòng hơn, gây khó chịu và đau đớn. Khá nhiều khung công tác đáng chú ý đã thực hiện chuyển đổi này, mặc dù cấu hình XML cũ thường vẫn là một tùy chọn.


Các chú thích được cho là có thể loại bỏ hoàn toàn tệp XML mặt cấu hình cho JSF. Chạy ngang qua bài đăng này trong khi cố gắng tìm hiểu làm thế nào để làm điều đó ...
Brian Knoblauch

6

Có 2 lượt xem chú thích

  1. Chế độ xem người dùng, hầu hết thời gian, các chú thích hoạt động như một phím tắt, giúp bạn tiết kiệm một số nét chính hoặc làm cho chương trình của bạn dễ đọc hơn

  2. Chế độ xem của nhà cung cấp, chế độ xem chú thích của bộ xử lý có trọng số nhẹ hơn 'giao diện', chương trình của bạn KHÔNG đối đầu với SOMETHING nhưng không "thực hiện" giao diện cụ thể (ở đây còn gọi là chú thích)

ví dụ trong jpa bạn định nghĩa một cái gì đó như

@Entity class Foo {...}

thay vì

class Foo implements Entity {...}

cả hai đều nói cùng một điều "Foo là một lớp thực thể"


3

Nơi chú thích có thể được sử dụng

Các chú thích có thể được áp dụng cho các khai báo: khai báo các lớp, trường, phương thức và các phần tử chương trình khác. Khi được sử dụng trên một tờ khai, mỗi chú thích thường xuất hiện, theo quy ước, trên dòng riêng của nó.

Cập nhật Java SE 8: chú thích cũng có thể được áp dụng cho việc sử dụng các loại. Dưới đây là một số ví dụ:

  • Biểu thức tạo cá thể lớp:

    mới @Iterned MyObject ();

  • Loại diễn viên:

    myString = (@NonNull Chuỗi) str;

  • thực hiện mệnh đề:

    class UnmodifiableList thực hiện Danh sách @Readonly <@Readonly T> {...}

  • Tuyên bố ngoại lệ ném:

    void MonitorTem Nhiệt độ () ném @Critical Nhiệt độ ngoại lệ {...}


2

Các khung như Hibernate có rất nhiều cấu hình / ánh xạ được yêu cầu sử dụng Chú thích rất nhiều.

Hãy xem chú thích Hibernate


1
Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Rohit Gupta

2

JPA (từ Java EE 5) là một ví dụ tuyệt vời về việc sử dụng (hơn) các chú thích. Java EE 6 cũng sẽ giới thiệu các chú thích trong nhiều lĩnh vực mới, chẳng hạn như các dịch vụ web RESTful và các chú thích mới cho mỗi API Servlet cũ tốt.

Dưới đây là một số tài nguyên:

Nó không chỉ là các chi tiết cụ thể về cấu hình được / có thể được sử dụng bởi các chú thích, mà chúng còn có thể được sử dụng để kiểm soát hành vi. Bạn thấy điều này tốt trở lại trong các ví dụ JAX-RS của Java EE 6.


1

Nó rất hữu ích cho việc chú thích các lớp của bạn, ở cấp độ phương thức, lớp hoặc trường, một cái gì đó về lớp đó không hoàn toàn liên quan đến lớp.

Bạn có thể có các chú thích của riêng mình, được sử dụng để đánh dấu các lớp nhất định là chỉ sử dụng thử nghiệm. Nó có thể chỉ đơn giản là cho mục đích tài liệu, hoặc bạn có thể thực thi nó bằng cách lọc nó ra trong quá trình biên dịch một ứng cử viên phát hành sản xuất.

Bạn có thể sử dụng các chú thích để lưu trữ một số dữ liệu meta, như trong khung plugin, ví dụ: tên của plugin.

Nó chỉ là một công cụ khác, nó có nhiều mục đích.


1

Nó đính kèm thông tin bổ sung về mã bằng cách (a) kiểm tra trình biên dịch hoặc (b) phân tích mã

**

  • Sau đây là các chú thích tích hợp :: 2 loại

**

Loại 1) Chú thích áp dụng cho mã java:

@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method
Public doSomething()....

@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})

Loại 2) Chú thích áp dụng cho các chú thích khác:

@Retention - Specifies how the marked annotation is storedWhether in code only, compiled into the class, or available at run-time through reflection.

@Documented - Marks another annotation for inclusion in the documentation.

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).

**

  • Chú thích tùy chỉnh ::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


ĐỂ HIỂU R BET RÀNG HIỂU LIÊN KẾT DƯỚI ĐÂY LIÊN KẾT: TUYỆT VỜI VỚI BÀI TẬP


http://www.javabeat.net/2007/08/annotations-in-java-5-0/


0

Chú thích có thể được sử dụng thay thế cho các tệp cấu hình bên ngoài, nhưng không thể được coi là sự thay thế hoàn toàn. Bạn có thể tìm thấy nhiều ví dụ trong đó chú thích đã được sử dụng để thay thế các tệp cấu hình, như Hibernate, JPA, EJB 3 và gần như tất cả các công nghệ có trong Java EE.

Dù sao đây không phải là sự lựa chọn tốt. Mục đích của việc sử dụng các tệp cấu hình thường là để tách mã khỏi các chi tiết của môi trường nơi ứng dụng đang chạy. Trong các tình huống như vậy và chủ yếu là khi cấu hình được sử dụng để ánh xạ ứng dụng vào cấu trúc của hệ thống bên ngoài, chú thích không phải là sự thay thế tốt cho tệp cấu hình, vì chúng mang đến cho bạn bao gồm các chi tiết của hệ thống bên ngoài bên trong mã nguồn của ứng dụng của bạn. Ở đây các tệp bên ngoài phải được coi là lựa chọn tốt nhất, nếu không, bạn sẽ cần sửa đổi mã nguồn và biên dịch lại mỗi khi bạn thay đổi một chi tiết có liên quan trong môi trường thực thi.

Các chú thích phù hợp hơn nhiều để trang trí mã nguồn với thông tin bổ sung hướng dẫn các công cụ xử lý, cả về thời gian biên dịch và thời gian chạy, để xử lý các lớp và cấu trúc lớp theo cách đặc biệt. @Overridevà JUnit @Testlà những ví dụ điển hình về cách sử dụng như vậy, đã được giải thích chi tiết trong các câu trả lời khác.

Cuối cùng, quy tắc luôn giống nhau: giữ bên trong nguồn những thứ thay đổi theo nguồn và giữ bên ngoài nguồn những thứ thay đổi độc lập với nguồn.


0

Java EE 5 ủng hộ việc sử dụng các chú thích trên cấu hình XML. Ví dụ, trong EJB3, các thuộc tính giao dịch trên phương thức EJB được chỉ định bằng cách sử dụng các chú thích. Họ thậm chí sử dụng các chú thích để đánh dấu POJO là EJB và để chỉ định các phương thức cụ thể là phương thức vòng đời thay vì yêu cầu thực hiện giao diện đó.


0

Mục đích của chú thích Java chỉ đơn giản là liên kết thông tin với phần tử chương trình chú thích. Các chú thích Java có thể được sử dụng làm công cụ sửa đổi trong bất kỳ khai báo nào, cho dù gói, lớp (bao gồm cả enums), giao diện (bao gồm các loại chú thích), trường, phương thức, tham số chính thức, hàm tạo hoặc biến cục bộ.

Các chú thích Java cũng có thể được sử dụng trên các hằng số enum. Các chú thích như vậy được đặt ngay trước hằng số enum mà chúng chú thích. Các chú thích Java được đặt theo quy ước trước tất cả các sửa đổi khác, nhưng đây không phải là một yêu cầu; chúng có thể được tự do trộn lẫn với các sửa đổi khác.

Đọc chi tiết về Chú thích Java .


0

Sau đây là một số nơi bạn có thể sử dụng chú thích.

a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations

Bạn có thể tham khảo liên kết này để biết thêm chi tiết về chú thích.

Bạn có thể tham khảo liên kết này để xem cách chú thích được sử dụng để xây dựng bộ kiểm tra đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.