주석을 사용할 수있는 주요 영역은 무엇입니까? 이 기능은 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-
@Test
JUnit 러너를 실행하려는 각 테스트 방법에 주석을 추가합니다 . 테스트 설정과 관련하여 추가 주석이 있습니다 (예 :@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 가지 뷰가 있습니다
-
사용자보기, 대부분의 경우 주석은 바로 가기처럼 작동하거나 일부 키 입력을 저장하거나 프로그램을 더 읽기 쉽게 만듭니다.
-
벤더 뷰, 프로세서의 주석 뷰는 더 가벼운 ‘인터페이스’에 가깝습니다. 프로그램은 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 {…}이 발생 함