자바 주석
Java annotationJava 컴퓨터 프로그래밍 언어에서 주석은 Java 소스 [1]코드에 추가할 수 있는 구문 메타데이터의 한 형태입니다.클래스, 메서드, 변수, 파라미터 및 Java 패키지에 주석을 달 수 있습니다.Java 태그와 마찬가지로 Java 주석을 소스 파일에서 읽을 수 있습니다.Javadoc 태그와 달리 Java 어노테이션은 Java 컴파일러에 의해 생성된 Java 클래스 파일에 포함되거나 Java 어노테이션에서 읽을 수도 있습니다.이렇게 하면 Java 가상 머신에서 런타임에 주석을 유지하고 [2]리플렉션으로 읽을 수 있습니다.Java에서 [3]기존 주석에서 메타 주석을 생성할 수 있습니다.
역사
Java 플랫폼에는 수식자 또는 javadoc 태그 등 다양한 애드혹 주석 메커니즘이 있습니다.Java Specification Request JSR-175는 범용 주석(메타데이터라고도 함) 기능을 2002년에 Java Community Process에 도입하여 2004년 [4]9월에 승인을 받았습니다.주석은 Java Development Kit(JDK) 버전 1.5부터 언어 자체로도 사용할 수 있게 되었습니다.이 툴은 JDK 버전 1.5에서 컴파일 타임 주석 처리를 위한 임시 인터페이스를 제공했습니다.JSR-269는 이를 공식화하고 버전 1.6에서 javac 컴파일러에 통합되었습니다.
삽입 주석
Java는 언어에 내장된 주석 집합을 정의합니다.7개의 표준 주석 중 3개는 java.lang의 일부이며 나머지 4개는 java.lang.[5][6]annotation에서 Import됩니다.
Java 코드에 적용되는 주석:
@Override- 메서드가 오버라이드인지 확인합니다.메서드가 부모 클래스 또는 구현된 인터페이스 중 하나에서 발견되지 않으면 컴파일 오류가 발생합니다.@Deprecated- 메서드를 사용되지 않음으로 표시합니다.메서드가 사용되는 경우 컴파일 경고를 발생시킵니다.@SuppressWarnings- 주석 매개 변수에 지정된 컴파일 시간 경고를 억제하도록 컴파일러에 지시합니다.
다른 주석("메타 주석"이라고도 함)에 적용되는 주석:
@Retention- 표시된 주석이 코드로만 저장되거나 클래스로 컴파일되거나 리플렉션을 통해 런타임에 사용할 수 있는 방법을 지정합니다.@Documented- 설명서에 포함할 다른 주석을 표시합니다.@Target- 다른 주석을 표시하여 주석을 적용할 수 있는 Java 요소의 종류를 제한합니다.@Inherited- 주석 클래스의 하위 클래스에 상속될 다른 주석을 표시합니다(기본적으로 주석은 하위 클래스에 상속되지 않음).
Java 7 이후 언어에 3개의 주석이 추가되었습니다.
@SafeVarargsJava 7 이후 genericsvarargs 파라미터를 사용하여 메서드 또는 컨스트럭터의 모든 호출자에 대한 경고를 억제합니다.@FunctionalInterface- Java 8 이후 타입 선언을 기능 인터페이스로 하도록 지정합니다.@Repeatable- Java 8 이후 동일한 선언에 주석을 두 번 이상 적용할 수 있도록 지정합니다.
예
삽입 주석
다음 예시는 의 사용을 나타내고 있습니다.@Override주석입니다.이 명령어는 부모 클래스에서 일치하는 메서드를 체크하도록 컴파일러에 지시합니다.이 경우 오류가 발생합니다.gettype()클래스 메서드는 실제로 덮어쓰지 않습니다.getType()'동물을 좋아하다'는 반의 경우는 일치하지 않기 때문에 바람직합니다.이 경우,@Override새로운 이름 방법인 주석이 없습니다.gettype()클래스 Cat에서 생성됩니다.
일반의 학급 동물 { 일반의 무효 말하다() { } 일반의 스트링 get Type(유형)() { 돌아가다 "일반 동물"; } } 일반의 학급 고양이 확장 동물 { @오버라이드 일반의 무효 말하다() { // 이것은 적절한 오버라이드입니다. 시스템..나가..인쇄("야옹"); } @오버라이드 일반의 스트링 get type() { // 입력 오류로 인한 컴파일 시간 오류는 gettype()이 아니라 getType()이어야 합니다. 돌아가다 '고양이'; } } 커스텀 주석
주석 유형 선언은 일반 인터페이스 선언과 유사합니다.키워드 interface 앞에 at-sign(@)이 붙습니다.
// @Twizzle은 메서드 전환()에 대한 주석입니다. @흔들리다 일반의 무효 토글() { } // 주석 트위즐을 선언합니다. 일반의 @interface 트위즐 { } 주석에는 주석 유형의 메서드로 모델링된 키-값 쌍 세트가 포함될 수 있습니다.각 메서드 선언은 주석 유형의 요소를 정의합니다.메서드 선언에는 매개 변수 또는 throws 절을 사용할 수 없습니다.반환 유형은 원시, 문자열, 클래스, 열거, 주석 및 이전 유형의 배열로 제한됩니다.메서드에는 기본값을 지정할 수 있습니다.
// 동일: @Edible(값 = true) @ 편집 가능(진실의) 아이템 아이템 = 신규 당근(); 일반의 @interface 먹을 수 있는 { 부울 가치() 체납 거짓의; } @작성자(첫번째 = '움파', 지난 = '룸파') 책 책 = 신규 책(); 일반의 @interface 작가. { 스트링 첫번째(); 스트링 지난(); } 주석 자체에 주석을 달아 사용할 수 있는 위치와 시기를 나타낼 수 있습니다.
@리텐션(유지 정책.런타임) // 런타임에 반사를 통해 이 주석을 액세스할 수 있도록 합니다. @타깃({요소 유형.방법}) // 이 주석은 클래스 메서드에만 적용할 수 있습니다. 일반의 @interface 트위저블 { } 컴파일러는 일련의 특별한 주석을 예약합니다.@Deprecated,@Override그리고.@SuppressWarnings)를 참조해 주세요.
주석은 종종 외부 소스(XML 구성 파일 등) 또는 프로그래밍 방식으로 선언해야 하는 사용자 정의 클래스 및 메서드에 동작을 편리하게 적용하는 방법으로 프레임워크에서 사용됩니다.예를 들어 주석이 달린 JPA 데이터 클래스는 다음과 같습니다.
@엔티티 // 엔티티 bean으로 선언합니다. @표(이름. = '사람') // bean을 SQL 테이블 "people"에 매핑합니다. 일반의 학급 사람인 용구 시리얼화 가능 { @Id // 기본 키 열에 매핑합니다. @생성값(전략. = 시대유형.AUTO) // 데이터베이스가 우리가 아닌 새 기본 키를 생성합니다. 사적인 정수 아이디; @칼럼(길이 = 32) // 열 값을 32자로 잘라냅니다. 사적인 스트링 이름.; 일반의 정수 getId() { 돌아가다 아이디; } 일반의 무효 setId(정수 아이디) { 이것..아이디 = 아이디; } 일반의 스트링 getName() { 돌아가다 이름.; } 일반의 무효 setName(스트링 이름.) { 이것..이름. = 이름.; } } 주석은 메서드 호출이 아니므로 그 자체로는 아무것도 수행하지 않습니다.오히려 클래스 객체는 런타임에 JPA 구현으로 전달되며, 그러면 객체와 관계 매핑을 생성하기 위해 주석을 추출합니다.
다음은 완전한 예를 제시하겠습니다.
패키지 컴포함; 수입품 java.displaces.information 입니다.문서화되어 있다; 수입품 java.displaces.information 입니다.요소 유형; 수입품 java.displaces.information 입니다.상속됨; 수입품 java.displaces.information 입니다.보유; 수입품 java.displaces.information 입니다.유지 정책; 수입품 java.displaces.information 입니다.대상; @문서화 @리텐션(유지 정책.런타임) @타깃({요소 유형.유형,요소 유형.방법, 요소 유형.컨스트럭터,요소 유형.주석_타입, 요소 유형.패키지,요소 유형.들판,요소 유형.LOCAL_VARILE(로컬_변수)}) @상속 일반의 @interface 미완성 { 일반의 열거하다 우선 순위. { 낮다, 중간의, 높은 } 스트링 가치(); 스트링[] 변경자() 체납 ""; 스트링[] 최종 변경 기준() 체납 ""; 우선 순위. 우선 순위.() 체납 우선 순위..중간의; 스트링 작성자() 체납 제임스 고슬링; 스트링 최종 변경() 체납 "2011-07-08"; } 패키지 컴포함; 일반의 @interface 언더 컨스트럭션 { 스트링 주인() 체납 패트릭 노튼; 스트링 가치() 체납 "개체가 제작 중입니다."; 스트링 작성자() 체납 마이크 셰리던; 스트링 최종 변경() 체납 "2011-07-08"; } 패키지 com.validators; 수입품 javax.faces.application.Faces Message(페이스 메시지); 수입품 javax.faces.component를 지정합니다.UIC 컴포넌트; 수입품 를 클릭합니다.페이스 콘텍스트; 수입품 javax.faces.validator.검증자; 수입품 javax.faces.validator.검증자예외.; 수입품 com.comation을 클릭합니다.언더 컨스트럭션; 수입품 com.comation을 클릭합니다.미완성; 수입품 com.comation을 클릭합니다.미완성.우선 순위.; 수입품 com.discloss.conf를 클릭합니다.효용; @UnderConstruction(건설중)(주인=신원미상) 일반의 학급 Date Validator(날짜 검증자) 용구 검증자 { 일반의 무효 입증하다(페이스 콘텍스트 맥락, UIC 컴포넌트 요소, 물건 가치) 던지다 검증자예외. { 스트링 날짜. = (스트링) 가치; 스트링 error Label(오류 라벨) = "유효한 날짜를 입력하십시오."; 한다면 (!요소.get Attributes(속성)().비어 있다()) { error Label(오류 라벨) = (스트링) 요소.get Attributes(속성)().얻다("오류 표시"); } 한다면 (!효용.입증하다AGiven 날짜(날짜.)) { @미완성(변경자 = "스티브", 가치 = "메시지를 컨텍스트에 추가할지 여부, 확인", 우선 순위. = 우선 순위..높은 ) Faces Message(페이스 메시지) 메세지 = 신규 Faces Message(페이스 메시지)(); 메세지.set Severity(Faces Message(페이스 메시지).중대도_오류); 메세지.set Summary(요약)(error Label(오류 라벨)); 메세지.setDetail(Set Detail)(error Label(오류 라벨)); 던지다 신규 검증자예외.(메세지); } } } 처리.
Java 소스 코드가 컴파일되면 주석 프로세서로 불리는 컴파일러 플러그인으로 주석을 처리할 수 있습니다.프로세서는 정보 메시지를 생성하거나 추가 Java 소스 파일 또는 리소스를 생성할 수 있습니다. 이러한 파일 또는 리소스는 컴파일 및 처리될 수 있습니다.그러나 주석 프로세서는 주석이 달린 코드 자체를 수정할 수 없습니다. (코드 수정은 Java Language Specification 이상의 메서드를 사용하여 구현할 수 있습니다.)Java 컴파일러는 주석 메타데이터를 클래스 파일에 조건부로 저장합니다(주석에 다음이 있는 경우).RetentionPolicy의CLASS또는RUNTIME나중에 JVM이나 다른 프로그램이 메타데이터를 검색하여 프로그램 요소와 상호 작용하거나 동작을 변경하는 방법을 결정할 수 있습니다.
주석 프로세서를 사용하여 주석을 처리하는 것 외에 Java 프로그래머는 반사를 사용하여 주석을 처리하는 자신만의 코드를 작성할 수 있습니다.Java SE 5는 에 정의되어 있는 새로운 인터페이스를 지원합니다.java.lang.reflect패키지.이 패키지에는 다음과 같은 인터페이스가 포함되어 있습니다.AnnotatedElement다음과 같은 자바 리플렉션클래스에 의해 구현됩니다.Class,Constructor,Field,Method,그리고.Package이 인터페이스의 실장은 Java Virtual Machine에서 현재 실행되고 있는 프로그램의 주석 요소를 나타내기 위해 사용됩니다.이 인터페이스를 통해 주석을 반사적으로 읽을 수 있습니다.
그AnnotatedElement인터페이스는, 다음의 어노테이션에의 액세스를 제공합니다.RUNTIME보유.이 액세스는 에 의해 제공됩니다.getAnnotation,getAnnotations,그리고.isAnnotationPresent방법들.주석 유형은 클래스와 마찬가지로 컴파일되어 바이트 코드 파일에 저장되므로 이러한 메서드에 의해 반환된 주석을 일반 Java 개체와 동일하게 쿼리할 수 있습니다.주석 처리의 전체 예는 다음과 같습니다.
수입품 java.displaces.information 입니다.보유; 수입품 java.displaces.information 입니다.유지 정책; // 처리할 주석입니다. // 타겟 기본값은 all Java 요소 // 보존 정책을 RUNTime으로 변경(기본값은 CLASS) @리텐션(유지 정책.런타임) 일반의 @interface 타입헤더 { // 개발자 속성에 지정된 기본값 스트링 현상자() 체납 "알 수 없음"; 스트링 최종 수정필(); 스트링 [] 팀원(); 인트 삶의 의미(); } // 클래스에 적용되는 주석입니다. @TypeHeader(현상자 = 밥비, 최종 수정필 = "2013-02-12", 팀원 = { '앤', '단', '프랑' }, 삶의 의미 = 42) 일반의 학급 Set Custom Annotation(커스텀 주석 설정) { // 수업내용은 이쪽 } // 주석을 처리하는 예제 코드입니다. 수입품 java.displaces.information 입니다.주석; 수입품 java.displect.reflect.주석 요소; 일반의 학급 사용자 지정 주석 사용 { 일반의 정적인 무효 주된(스트링 [] args) { 학급< >Set Custom Annotation(커스텀 주석 설정)> class Object(class Object) = Set Custom Annotation(커스텀 주석 설정).학급; 주석 읽기(class Object(class Object)); } 정적인 무효 주석 읽기(주석 요소 요소) { 해라 { 시스템..나가..인쇄("주석 요소 값: \n"); 한다면 (요소.is Annotation Present(주석 있음)(타입헤더.학급)) { // getAnnotation이 주석 유형을 반환합니다. 주석 단일 주석 = 요소.주석 취득(타입헤더.학급); 타입헤더 머리글자 = (타입헤더) 단일 주석; 시스템..나가..인쇄("개발자: " + 머리글자.현상자()); 시스템..나가..인쇄("최종 수정일: " + 머리글자.최종 수정필()); // teamMembers가 String []으로 반환됨 시스템..나가..인쇄물("팀원: "); 위해서 (스트링 멤버 : 머리글자.팀원()) 시스템..나가..인쇄물(멤버 + ", "); 시스템..나가..인쇄물("\n"); 시스템..나가..인쇄("삶의 의미: "+ 머리글자.삶의 의미()); } } 또 만나 (예외. 예외.) { 예외..print Stack Trace(프린트 스택 트레이스)(); } } } 야생에서의 사용
연구자들은 GitHub에서 호스팅되는 1,094개의 주목할 만한 오픈 소스 Java 프로젝트의 Java 주석 사용을 연구해 왔다.그들은 많은 주석이 추가되면서 주석은 활발하게 유지되지만 주석 유형이나 값의 버그로 인해 변경되거나 제거된다는 것을 발견했다.전반적으로, 이 연구는 주석 사용과 코드 오류-프로니티 사이에 작지만 중요한 관계가 있다는 것을 발견했다. 즉, 주석이 있는 Java 코드는 오류 [7]발생 가능성이 낮은 경향이 있다.
「 」를 참조해 주세요.
- 자카르타 주석
- CLI 어트리뷰트
- 자바 프로그래밍
- Java 가상 머신
- 모델 지향 아키텍처
- 유사한 구문을 가진 Java 주석에서 영감을 얻은 Python 데코레이터.
레퍼런스
- ^ 를 클릭합니다"Annotations". Sun Microsystems. Archived from the original on 2011-09-25. Retrieved 2011-09-30..
- ^ 를 클릭합니다Sun Microsystems (2005). Java(TM) Language Specification (3rd ed.). Prentice Hall. ISBN 0-321-24678-0..
- ^ Dare Obasanjo (2007). "A COMPARISON OF MICROSOFT'S C# PROGRAMMING LANGUAGE TO SUN MICROSYSTEMS' JAVA PROGRAMMING LANGUAGE: Metadata Annotations". Dare Obasanjo. Archived from the original on 2012-09-19. Retrieved 2012-09-20.
- ^ Coward, Danny (2006-11-02). "JSR 175: A Metadata Facility for the JavaTM Programming Language". Java Community Process. Retrieved 2008-03-05.
- ^ "Predefined Annotation Types". Oracle Corporation. Retrieved 2016-12-17.
- ^ "The Built-In Annotations : Standard Annotations". Retrieved 2016-12-17.
- ^ Yu, Zhongxing; Bai, Chenggang; Seinturier, Lionel; Monperrus, Martin (2019). "Characterizing the Usage, Evolution and Impact of Java Annotations in Practice". IEEE Transactions on Software Engineering. 47 (5): 969–986. arXiv:1805.01965. doi:10.1109/TSE.2019.2910516. S2CID 102351817.