Java 5.0 버전으로 주석이 도입 된 이후 Java 플랫폼의 매우 중요한 부분이되었습니다. 개발 과정에서 우리는 종종 @override 및 @deprecated와 같은 주석이 응용 프로그램 코드에서 나타납니다. 이 기사에서는 주석이 무엇인지, 소개 해야하는지, 주석이 어떻게 작동하는지, 사용자 정의 주석을 작성하는 방법 (예를 통해) 및 최신 주석 및 ADF (애플리케이션 개발 프레임 워크)를 사용할 수있는 상황에서 알려줍니다. 약간의 시간이 걸릴 것이므로 커피 한 잔을 준비하고 주석의 세계로 들어가게하십시오.
주석이란 무엇입니까?
한 단어는 주석, 즉 메타 데이터, 즉 데이터를 설명하는 데이터를 설명 할 수 있습니다. 따라서 주석이 소스 코드의 메타 데이터라고 말할 수 있습니다. 예를 들어 다음 코드 :
@overridepublic String toString () {return "이것은 현재 객체의 문자열 표현입니다.";}위의 코드에서는 tostring () 메소드를 다시 작성하고 @override 주석을 사용합니다. 그러나 코드를 표시하기 위해 @override 주석을 사용하지 않더라도 프로그램은 정상적으로 실행할 수 있습니다. 그렇다면 주석은 무엇을 의미합니까? 이런 식으로 글을 쓰는 데 도움이 되나요? 실제로 @override는 컴파일러 에게이 메소드가 다시 쓰기 메소드 (메타 데이터를 설명하는 메타 데이터)임을 알려줍니다. 메소드가 부모 클래스에 존재하지 않으면 컴파일러는 오류를보고하여 메소드가 부모 클래스에서 메소드를 다시 작성하지 않음을 제기합니다. 실수로 잘못된 오타를 철자하는 경우, 예를 들어 ToString ()를 toString () {double r}로 작성하고 @override 주석을 사용하지 않으면 프로그램을 컴파일하고 실행할 수 있습니다. 그러나 작업 결과는 내가 예상 한 것과 매우 다를 것입니다. 이제 우리는 주석이 무엇인지 이해하고 주석을 사용하면 프로그램을 읽는 데 도움이됩니다.
주석은 클래스, 메소드, 매개 변수, 변수, 생성자 및 패키지 선언에 적용되는 특수 수정 자입니다. 메타 데이터를 설명하기 위해 JSR-175 표준이 선택한 도구입니다.
주석을 도입하는 이유는 무엇입니까?
이전 (또는 사용 후) XML은 메타 데이터를 설명하는 데 널리 사용됩니다. 일부 애플리케이션 개발자와 건축가는 XML의 유지 보수가 악화되고 있음을 알기 시작했습니다. XML과 같이 코드에 느슨하게 연결된 코드 설명이 아니라 코드에 밀접하게 연결된 것을 사용하려고합니다. Google에서 "XML 대 주석"을 검색하면이 문제에 대한 많은 논쟁이 보일 것입니다. 가장 흥미로운 점은 XML 구성이 실제로 별도의 코드 및 구성을 위해 도입된다는 것입니다. 위의 두 가지 견해가 당신을 혼란스럽게 할 수 있습니다. 두 견해 모두주기를 형성하는 것처럼 보이지만 각각은 장단점을 가지고 있습니다. 예제를 사용하여 둘의 차이점을 이해해 봅시다.
애플리케이션에 대해 많은 상수 또는 매개 변수를 설정하려면 XML이 특정 코드에 연결되지 않기 때문에이 경우에 좋은 선택입니다. 방법을 서비스로 선언하려면 주석과 방법을 단단히 결합해야하며 개발자가이를 인식해야하기 때문에 주석을 사용하는 것이 좋습니다.
또 다른 중요한 요소는 주석이 메타 데이터를 설명하는 표준 방법을 정의한다는 것입니다. 그 전에 개발자는 일반적으로 자체 방식으로 메타 데이터를 정의합니다. 예를 들어 태그가 지정된 인터페이스, 주석, 과도 키워드 등을 사용하십시오. 각 프로그래머는 주석의 표준 방식과 달리 메타 데이터를 자신의 방식으로 정의합니다.
현재 많은 프레임 워크는 XML과 주석을 사용하여 두 가지 간의 장단점의 균형을 맞추고 있습니다.
주석은 어떻게 작동합니까? 사용자 정의 주석을 작성하는 방법?
이 부분을 말하기 전에 먼저 주석 샘플 코드 annotationssample.zip을 다운로드하는 것이 좋습니다. 다운로드 후 사용하는 데 익숙한 IDE에 넣으십시오. 이 코드는 주석 메커니즘을 더 잘 이해하는 데 도움이됩니다.
주석 작성은 매우 간단합니다. 주석 정의를 인터페이스의 정의와 비교할 수 있습니다. 두 가지 예를 살펴 보겠습니다. 하나는 표준 주석 @override이고 다른 하나는 사용자 정의 주석 @todo입니다.
@TARGET (ElementType.Method) @retention (rendentionpolicy.source) public @interface atredid {}@override 주석에 대해 몇 가지 질문이있을 수 있습니다. 아무것도하지 않으므로 부모 클래스에 동일한 이름을 가진 기능이 있는지 어떻게 확인합니까? 물론, 놀라지 마십시오. 난 그냥 당신을 괴롭 히고 있습니다. @override 주석의 정의는 그 작은 코드가 아닙니다. 콘텐츠 의이 부분은 매우 중요합니다. 다시 반복해야합니다. 주석은 메타 데이터 일 뿐이며 비즈니스 논리와 관련이 없습니다. 이해하기가 조금 어렵지만 그게 다야. 주석에 비즈니스 논리가 포함되어 있지 않은 경우 누군가는이를 구현해야합니다. 메타 데이터 사용자가이를 수행합니다. 주석은 정의하는 속성에 대한 정보 만 제공합니다 (클래스/메소드/패키지/도메인). 주석 사용자 (일부 코드)는이 정보를 읽고 필요한 논리를 구현합니다.
Java의 주석 (예 : @override)을 사용하면 JVM은 바이트 코드 수준에서 작동하는 사용자입니다. 이 시점에서 응용 프로그램 개발자는 사용자 정의 주석을 제어하거나 사용할 수 없습니다. 그래서 맞춤형 주석을 작성하는 방법을 설명해 봅시다.
사용자 정의 주석을 하나씩 작성하는 핵심 사항에 대해 이야기합시다. 위의 예에서는 주석에 일부 주석이 적용됩니다.
J2Se5.0 버전은 Java.lang.annotation에서 4 가지 종류의 메타 주석을 제공하며, 특히 다른 주석에 주석을 달 수 있습니다.
@documented 간단한 주석 태그 주석이 주석 정보가 Java 문서에 추가되는지 여부를 나타내는 주석을 표시합니다.
@retention 은이 주석의 수명주기를 정의합니다.
resentpolicy.source는 컴파일 단계에서 폐기됩니다. 이러한 주석은 컴파일 후 더 이상 의미가 없으므로 바이트 코드를 작성하지 않습니다. @override, @suppresswarnings는 모두 이러한 유형의 주석에 속합니다.
클래스가로드되면 rendentionpolicy.class 가 폐기됩니다. 바이트 코드 파일 처리에 유용합니다. 이것은 주석의 기본 메소드입니다.
retentionpolicy.runtime은 결코 폐기되지 않으며 런타임 중에 주석이 유지되므로 주석 정보를 반사 메커니즘을 사용하여 읽을 수 있습니다. 우리의 맞춤형 주석은 일반적으로 이런 식으로 사용됩니다.
@target 은이 주석이 사용되는 위치를 나타냅니다. 지정되지 않으면 주석을 어디에나 배치 할 수 있습니다. 사용 가능한 매개 변수 중 일부는 다음과 같습니다. 속성의 주석은 호환됩니다. 7 가지 속성 모두에 주석을 추가하고 하나의 속성 만 제외하려면 모든 속성을 포함하도록 대상을 정의해야합니다.
@Inherited는 이 주석과 서브 클래스 사이의 관계를 정의합니다
그렇다면 주석의 내부 정의는 어떻습니까? 주석은 기본 유형, 문자열 및 열거 유형 만 지원합니다. 주석의 모든 속성은 메소드로 정의되며 기본값이 제공 될 수 있습니다.
@TARGET (elementType.Method) @ReTention (rendentionPolicy.runtime) @Interface {public enum priority {low, medium, high} public enum status {starting, not_started} string author () 기본 "yash"; 우선 순위 우선 순위 () 기본 상태 () 기본 상태 () 기본 상태. 다음 예제는 위의 주석을 사용하는 방법을 보여줍니다.
@todo (우선 순위 = todo.priority.medium, author = "yashwant", status = todo.status.started) public void inmpermetemethod1 () {// 일부 비즈니스 로직이 작성되었지만 아직 완료되지 않았습니다}} 주석에 속성이 하나만 있으면 직접 "값"으로 명명 될 수 있으며 사용할 때 속성 이름을 표시 할 필요가 없습니다.
@Interface author {String value ();}@author ( "Yashwant") public void somemethod () {} 그러나 지금까지 모든 것이 꽤 좋아 보입니다. 우리는 우리 자신의 주석을 정의하고 비즈니스 로직 방법에 적용합니다. 이제 우리는 주석을 호출하기 위해 사용자 프로그램을 작성해야합니다. 여기서 우리는 반사 메커니즘을 사용해야합니다. 반사 코드에 익숙하다면 반사가 클래스 이름, 메소드 및 인스턴스 변수 객체를 제공 할 수 있음을 알 수 있습니다. 이 모든 객체에는 주석 정보를 반환하기위한 getAnnotation () 메소드가 있습니다. 이 객체를 사용자 정의 주석으로 변환해야하며 (instanceof ()로 확인한 후), 사용자 정의 주석에서 메소드를 호출 할 수도 있습니다. 위의 주석을 사용하여 다음 예제 코드를 살펴보십시오.
클래스 BusinessLogicClass = businessLogic.class; for (메소드 메소드 : BusinessLogicClass.getMethods ()) {todo) 메소드 (TODO) 메소드 (todo.class); if (todoAnnotation! = null) {system.out.println ( "Method :" + method.getmame ()); todoannotation.author ()); system.out.println ( "우선 순위 :" + todoannotation.priority ()); system.out.println ( "atsters :" + todoannotation.status ());}}주석 사용 사례
주석의 기능은 매우 강력하며 Spring 및 Hebernate와 같은 프레임 워크는 로깅 및 유효성에 주석을 사용합니다. 마커 인터페이스가 사용되는 경우 주석을 적용 할 수 있습니다. 차이점은 TAG 인터페이스가 전체 클래스를 정의하는 데 사용되지만 서비스로 메소드를 노출할지 여부와 같은 단일 메소드에 대한 주석을 정의 할 수 있다는 것입니다.
최신 Servlet 3.0, 특히 Servlet Security와 관련된 많은 새로운 주석이 도입되었습니다.
핸드 타입 이 주석은 ServletContainerInitializer에 전달되는 일련의 응용 프로그램 클래스를 나타냅니다.
httpconstraint 이 주석은 모든 HTTP 방법의 애플리케이션 요청에 대한 보안 제약을 나타내며 Servletsecurity 주석에 정의 된 HTTPMethodConstraint 보안 제약 조건과 다릅니다.
httpmethodconstraint servletsecurity 주석의 HTTP 프로토콜 메소드 유형을 설명하는 주석과 다른 다양한 유형의 요청에 대한 보안 제약 조건을 지정합니다.
MultipartConfig 이 주석은 서블릿에 표시되어 서틀이 처리하려는 요청의 MIME 유형이 Multipart/Form-Data임을 나타냅니다.
Servletsecurity 주석은 Servlet 상속 클래스에 표시되며 HTTP 프로토콜 요청은 보안 제약 조건을 준수해야합니다.
WebFilter는 서버 필터를 선언하는 데 사용됩니다.
Webinitparam 이 주석은 서블릿 또는 필터에서 초기화 매개 변수를 선언하는 데 사용되며 일반적으로 @webservlet 또는 @webfilter와 함께 사용됩니다.
Weblistener 이 주석은 웹 응용 프로그램의 맥락에서 다른 유형의 이벤트 선언 청취자입니다.
Webservlet 이 주석은 서블릿의 구성을 선언하는 데 사용됩니다.
ADF (응용 프로그램 프레임 워크) 및 주석
이제 우리는 기사의 마지막 부분에 대해 논의하기 시작합니다. ADF로 알려진 응용 프로그램 프레임 워크는 Oracle에 의해 Oracle Converged Application을 만들기 위해 개발되었습니다. 우리는 주석의 장점과 단점을 이해하고 맞춤형 주석을 작성하는 방법을 알고 있지만 주석을 어디에 적용해야합니까? ADF는 약간의 주석을 제공합니까? 좋은 질문은 실제로 ADF에서 주석을 사용하는 데 몇 가지 한계가 있습니다. Spring 및 Hibernate와 같은 앞에서 언급 한 응용 프로그램 프레임 워크는 AOP (Side-Teriented Programming)를 사용합니다. AOP에서 프레임 워크는 코드를 사전 처리 및 후속 이벤트 처리에 주입하는 메커니즘을 제공합니다. 예를 들어, 메소드 실행 전후에 코드를 추가 할 수있는 후크가 있으므로이 장소에서 사용자 코드를 작성할 수 있습니다. ADF는 AOP를 사용하지 않습니다. 사용 가능한 주석에 대한 사용 사례가 있으면 상속을 통해이를 구현해야 할 수도 있습니다.
이 기사가 주석의 의미를 더 잘 이해하는 데 도움이되기를 바랍니다.