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

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



답변

주석들은 메타 메타 오브젝트 다른 설명하는 데 사용될 수있다 메타 개체 . 메타 객체는 클래스, 필드 및 메서드입니다. 객체에 메타 객체 (예 :)를 요청하는 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메소드 를 정의하십시오 .


답변

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 표준 (지속성, 종속성 주입, 이름 지정)에 의해 사용되는 주석 처리의 종류입니다.


답변

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

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

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

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

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


답변

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";
}


답변

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

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


답변

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

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

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

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

@Entity class Foo {...}

대신에

class Foo implements Entity {...}

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


답변

주석을 사용할 수있는 곳

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

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

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

    새로운 @Interned MyObject ();

  • 캐스트 유형 :

    myString = (@NonNull 문자열) str;

  • 조항을 구현합니다.

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

  • 예외 선언 발생 :

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