주석은 Java에서 어떻게 그리고 어디에 사용됩니까?


218

주석을 사용할 수있는 주요 영역은 무엇입니까? 이 기능은 XML 기반 구성을 대체합니까?


2
cdb, 나는 당신이 바운티에 대한 아이디어를 완전히 얻지 못했다는 것을 확신합니다. 여기에 꽤 좋은 답변이 많이 있으며, 누락 된 것이 무엇인지 또는 구체적으로 찾고있는 것에 대한 설명이 없으면 현상금을 추가했습니다. (여기에서이 작업을 수행했습니다 : stackoverflow.com/questions/1746550/… )
delfuego

5
좋아, 나는 이것이 오래되었다는 것을 알고 있지만 @delfuego : OP에게 바운티를 잘못 사용하고 있다고 말하면 올바르게 사용하는 방법을 설명하여 후속 조치를 취하는 것이 도움이 될 수 있습니다 .
Pops

답변:


308

주석들은 메타 메타 오브젝트 다른 설명하는 데 사용될 수있다 메타 개체 . 메타 객체는 클래스, 필드 및 메서드입니다. 객체에 메타 객체 (예 :)를 요청하는 anObj.getClass()것을 내부 검사 라고 합니다. 검사는 더 진행될 수 있으며 메타 객체에 주석 (예 :)이 무엇인지 물어볼 수 있습니다 aClass.getAnnotations. 검사 및 주석은 리플렉션메타 프로그래밍에 속합니다 .

주석은 유용한 방식으로 해석되어야합니다. 주석은 개발시 IDE 또는 컴파일러에 의해 또는 런타임 에 프레임 워크에 의해 해석 될 수 있습니다 .

주석 처리는 매우 강력한 메커니즘이며 다음과 같은 다양한 방법으로 사용할 수 있습니다.

  • 예 : 요소의 제약 또는 사용을 설명하기 위해 @Deprecated, @Override, 또는@NotNull
  • 요소의 "자연"을 설명하기 위해 @Entity, @TestCase, @WebService
  • 요소의 동작을 설명하기 위해 @Statefull, @Transaction
  • 요소를 처리하는 방법을 설명합니다. @Column, @XmlElement

모든 경우에 주석은 요소 를 설명 하고 의미를 명확하게하기 위해 사용됩니다 .

JDK5 이전에는 주석으로 표현 된 정보를 다른 곳에 저장해야했으며 XML 파일이 자주 사용되었습니다. 그러나 주석은 Java 코드 자체에 속하기 때문에 주석을 사용하는 것이 더 편리하므로 XML보다 조작하기가 훨씬 쉽습니다.

주석 사용법 :

  • XDoclet과 같은 문서
  • 편집
  • IDE
  • 테스트 프레임 워크 (예 : JUnit)
  • IoC 컨테이너 (예 : 스프링)
  • 직렬화 (예 : XML)
  • 화면 지향 프로그래밍 (AOP), 예 : Spring AOP
  • 응용 프로그램 서버 (예 : EJB 컨테이너, 웹 서비스)
  • 객체 관계형 매핑 (ORM), 예 : Hibernate, JPA
  • 그리고 더 많은...

... Lombok 프로젝트에서 예를 들어 주석을 사용하여 생성 방법 equals또는 hashCode메소드 를 정의하십시오 .


50

Java 어노테이션을위한 다양한 애플리케이션이 있습니다. 우선, 그것들은 컴파일러 (또는 컴파일러 확장)에 의해 사용될 수 있습니다. 예를 들어 무시 주석을 고려하십시오 .

class Foo {

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

이것은 실제로 Java JDK에 내장되어 있습니다. 컴파일러는 일부 메소드에 태그가 지정된 경우 기본 클래스에서 상속 된 메소드를 대체 하지 않고 오류를 표시합니다 . 이 주석은 메서드를 실제로 재정의하려는 일반적인 실수를 피하는 데 도움이 될 수 있지만 메서드에 지정된 서명이 재정의되는 메서드의 서명과 일치하지 않기 때문에 실패합니다.

class Foo {

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

JDK7부터는 모든 유형에 주석이 허용됩니다. 이 기능은 이제 다음과 같이 NotNull 과 같은 컴파일러 주석에 사용될 수 있습니다 .

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

이를 통해 컴파일러는 변수 및 null 값 의 부적절한 / 확인되지 않은 사용에 대해 경고 할 수 있습니다.

주석에 대한 또 다른 고급 응용 프로그램에는 런타임에 반영 및 주석 처리가 포함됩니다. 이것은 주석을 "XML 기반 구성의 대체"라고 말할 때 생각했던 것입니다. 이것은 필요한 메타 데이터 및 구성 정보를 제공하기 위해 예를 들어 다양한 프레임 워크 및 JCP 표준 (지속성, 종속성 주입, 이름 지정)에 의해 사용되는 주석 처리의 종류입니다.


18

주석은 Java 소스 파일에 추가 된 메타 데이터 형식 (데이터에 대한 데이터)입니다. 클라이언트 코드의 통합을 단순화하기 위해 프레임 워크에서 주로 사용됩니다. 내 머리 꼭대기에서 몇 가지 실제 사례 :

  • JUnit 4- @TestJUnit 러너를 실행하려는 각 테스트 방법에 주석을 추가합니다 . 테스트 설정과 관련하여 추가 주석이 있습니다 (예 : @Before@BeforeClass). 이 모든 것은 JUnit 러너에 의해 처리되며, 이에 따라 테스트가 실행됩니다. XML 구성을 대체한다고 말할 수 있지만 주석은 때로는 더 강력하고 (예를 들어 리플렉션을 사용할 수 있음) 참조하는 코드에 더 가깝습니다 ( @Test주석은 테스트 방법 바로 앞에 있으므로 목적은 그 방법 중 하나는 명확합니다-문서로도 사용됩니다). 반면에 XML 구성은 더 복잡 할 수 있으며 주석보다 훨씬 많은 데이터를 포함 할 수 있습니다.

  • 테라코타-주석과 XML 구성 파일을 모두 사용합니다. 예를 들어 @Root주석은 Terracotta 런타임에 주석이 달린 필드가 루트이며 VM 인스턴스간에 메모리를 공유해야한다고 알려줍니다. XML 구성 파일은 서버를 구성하고 계측 할 클래스를 알려주는 데 사용됩니다.

  • Google Guice-예는 @Inject주석입니다. 생성자에 적용될 때 Guice 런타임은 정의 된 인젝터를 기반으로 각 매개 변수의 값을 찾습니다. @Inject어노테이션은 XML 구성 파일을 사용하여 복제하는 것은 매우 어려울 것이다, 그것은에 참조하는 생성자의 근접성은 (사용자가 설정 한 모든 의존성 주입을 찾기 위해 거대한 XML 파일을 검색 할 필요 상상) 매우 유용하다.

다행스럽게도 다른 프레임 워크에서 주석이 사용되는 방식을 다양하게 소개했습니다.


12

Java의 주석은 클래스, 필드 및 메소드를 설명하는 수단을 제공합니다. 기본적으로 Java 소스 파일에 추가 된 메타 데이터 형식이므로 프로그램의 의미에 직접 영향을 줄 수 없습니다. 그러나 리플렉션을 사용하여 런타임에 주석을 읽을 수 있으며이 프로세스를 Introspection이라고합니다. 그런 다음 클래스, 필드 또는 메소드를 수정하는 데 사용될 수 있습니다.

이 기능은 종종 Libraries & SDK (hibernate, JUnit, Spring Framework)에 의해 활용되어 프로그래머가 이러한 라이브러리 또는 SDK를 사용하지 않는 한 코드의 양을 단순화하거나 줄일 수 있습니다. Java에서 반영 작업.

또한 주석의 가용성을 컴파일 타임 또는 런타임으로 제한 할 수 있습니다. 아래는 사용자 지정 주석을 만드는 간단한 예입니다.

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 {

}

IssueInfo.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

XML 기반 구성을 대체합니까?

코드 구조 (예 : JPA 매핑 또는 Spring의 의존성 주입)와 밀접하게 일치하는 구성은 주석으로 대체 될 수 있으며 일반적으로 덜 장황하고 성 가시고 고통 스럽습니다. 이전의 XML 구성은 일반적으로 옵션으로 남아 있지만 거의 모든 주목할만한 프레임 워크 가이 스위치를 만들었습니다.


아마도 주석은 JSF에 대한 faces-config XML 파일을 완전히 제거 할 수 있습니다. 이 게시물 가로 질러은 ... 그렇게하는 방법을 찾기 위해 노력하는 동안
브라이언 Knoblauch

6

주석에 대한 2 가지 뷰가 있습니다

  1. 사용자보기, 대부분의 경우 주석은 바로 가기처럼 작동하거나 일부 키 입력을 저장하거나 프로그램을 더 읽기 쉽게 만듭니다.

  2. 벤더 뷰, 프로세서의 주석 뷰는 더 가벼운 '인터페이스'에 가깝습니다. 프로그램은 SOMETHING에 직면하지만 특정 인터페이스를 명시 적으로 "구현"하지 않습니다 (여기서 주석)

예를 들어 jpa에서는 다음과 같이 정의합니다.

@Entity class Foo {...}

대신에

class Foo implements Entity {...}

둘 다 같은 말을 해요. "푸는 엔터티 클래스입니다"


3

주석을 사용할 수있는 곳

클래스, 필드, 메소드 및 기타 프로그램 요소 선언과 같은 어노테이션을 선언에 적용 할 수 있습니다 . 선언에 사용될 때, 각 주석은 일반적으로 자체 행에 표시됩니다.

Java SE 8 업데이트 : 주석을 유형 사용에 적용 할 수도 있습니다. 여기 몇 가지 예가 있어요.

  • 클래스 인스턴스 생성 표현식 :

    새로운 @Interned MyObject ();

  • 캐스트 유형 :

    myString = (@NonNull 문자열) str;

  • 조항을 구현합니다.

    UnmodifiableList 클래스는 @Readonly List <@Readonly T> {...}를 구현합니다.

  • 예외 선언 발생 :

    void monitorTemperature ()에서 @Critical TemperatureException {...}이 발생 함


2

Hibernate와 같은 프레임 워크는 주석을 많이 사용하여 많은 구성 / 매핑이 필요했습니다.

최대 절전 모드 주석 살펴보기


1
이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 바람직 합니다.
Rohit Gupta

2

JPA (Java EE 5)는 주석을 과도하게 사용하는 훌륭한 예입니다. Java EE 6은 또한 RESTful 웹 서비스 및 각 오래된 오래된 서블릿 API에 대한 새로운 주석과 같은 많은 새로운 영역에 주석을 도입 할 것입니다.

다음은 몇 가지 리소스입니다.

주석에 의해 인수 될 수있는 것은 특정 설정일뿐만 아니라 동작을 제어하는 ​​데 사용될 수도 있습니다. Java EE 6의 JAX-RS 예제에서이 점을 다시 알 수 있습니다.


1

메소드, 클래스 또는 필드 레벨에서 클래스와 관련이없는 클래스에 대해 클래스에 주석을 달 때 유용합니다.

특정 클래스를 테스트 전용으로 표시하는 데 사용되는 고유 한 주석이있을 수 있습니다. 문서화 목적 일 수도 있고, 프로덕션 릴리스 후보를 컴파일하는 동안이를 필터링하여 적용 할 수도 있습니다.

주석을 사용하여 플러그인 프레임 워크와 같은 일부 메타 데이터를 플러그인 이름과 같이 저장할 수 있습니다.

그것은 또 다른 도구이며 많은 목적을 가지고 있습니다.


1

(a) 컴파일러 검사 또는 (b) 코드 분석을 통해 코드에 대한 추가 정보를 첨부합니다.

**

  • 다음은 내장 주석입니다. : 2 가지 유형

**

타입 1) 자바 코드에 적용되는 주석 :

@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"})

유형 2) 다른 주석에 적용된 주석 :

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

**

  • 맞춤 주석 ::

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


더 나은 링크 아래의 이해 : 예와 함께 노력하십시오


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


0

주석은 외부 구성 파일의 대안으로 사용될 수 있지만 완전한 대체로 간주 될 수는 없습니다. Hibernate, JPA, EJB 3 및 Java EE에 포함 된 거의 모든 기술과 같은 구성 파일을 대체하기 위해 주석이 사용 된 많은 예를 찾을 수 있습니다.

어쨌든 이것이 항상 좋은 선택은 아닙니다. 구성 파일을 사용하는 목적은 일반적으로 응용 프로그램이 실행되는 환경의 세부 사항에서 코드를 분리하는 것입니다. 이러한 상황에서 주로 구성을 사용하여 응용 프로그램을 외부 시스템의 구조에 매핑하는 경우 주석은 외부 시스템의 세부 정보를 소스 코드 내에 포함 시키므로 구성 파일을 대체하지 않습니다. 너의 어플리케이션. 여기서 외부 파일은 최선의 선택으로 간주됩니다. 그렇지 않으면 실행 환경에서 관련 세부 사항을 변경할 때마다 소스 코드를 수정하고 다시 컴파일해야합니다.

주석은 컴파일 타임과 런타임에 처리 도구에 특별한 방식으로 클래스와 클래스 구조를 처리하도록 지시하는 추가 정보를 사용하여 소스 코드를 장식하는 데 훨씬 적합합니다. @OverrideJUnit @Test은 이러한 사용법의 좋은 예이며 이미 다른 답변에서 자세히 설명했습니다.

결국 규칙은 항상 동일합니다. 소스와 함께 변경되는 것을 소스 내부에 유지하고 소스와 독립적으로 변경되는 것을 소스 외부에 유지하십시오.


0

Java EE 5는 XML 구성보다 주석을 사용하는 것을 선호합니다. 예를 들어 EJB3에서 EJB 메소드의 트랜잭션 속성은 주석을 사용하여 지정됩니다. 또한 주석을 사용하여 POJO를 EJB로 표시하고 특정 메소드를 인터페이스 구현이 아닌 라이프 사이클 메소드로 지정합니다.


0

Java 어노테이션의 목적은 단순히 정보를 어노테이션이있는 프로그램 요소와 연관시키는 것입니다. Java 어노테이션은 패키지, 클래스 (enum 포함), 인터페이스 (어노테이션 유형 포함), 필드, 메소드, 형식 매개 변수, 생성자 또는 로컬 변수 등 모든 선언에서 수정 자로 사용될 수 있습니다.

Java 주석은 열거 형 상수에도 사용될 수 있습니다. 이러한 주석은 주석이 달린 열거 형 상수 바로 앞에 배치됩니다. Java 주석은 일반적으로 다른 모든 수정 자 앞에 배치되지만 필수 사항은 아닙니다. 이들은 다른 개질제와 자유롭게 혼합 될 수 있습니다.

Java Annotations 에 대해 자세히 읽으십시오 .


0

다음은 주석을 사용할 수있는 장소 중 일부입니다.

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

주석에 대한 자세한 내용 은이 링크 를 참조하십시오.

링크 를 참조하여 간단한 테스트 스위트를 빌드하는 데 주석이 어떻게 사용되는지 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.