다른 보존 정책이 내 주석에 어떤 영향을 줍니까?


175

사람이 명확한 방법으로 간의 실질적인 차이를 설명 할 수 java.lang.annotation.RetentionPolicy상수 SOURCE, CLASS등을 RUNTIME?

또한 "주석 유지"라는 문구의 의미가 확실하지 않습니다.



예, 나는 이미 읽었지만 실제로 어떻게 작동하는지 이해하지 못합니다. 실제로 'this phrase': "" ""를 시도하면 주석은 컴파일러에 의해 클래스 파일에 기록되지만 런타임에 VM에 의해 유지 될 필요는 없습니다. "" "그리고 ... 내가 아무것도 찾을 수 없습니다 않습니다 보존 정책 클래스에 주석을 넣어 디 컴파일 클래스를 열
xdevel2000

2
그런 다음 디 컴파일러는 주석을 지원하지 않는 것 같습니다. jd-gui가 잘 작동합니다.
musiKk

감사합니다 문제는 내 디 컴파일러 dj와 jad였습니다 ... jd-gui show me !!
xdevel2000

답변:


210
  • RetentionPolicy.SOURCE: 컴파일 중에 버리십시오. 이 주석은 컴파일이 완료된 후에는 의미가 없으므로 바이트 코드에 기록되지 않습니다.
    예 : @Override,@SuppressWarnings

  • RetentionPolicy.CLASS: 수업 중에 버리십시오. 바이트 코드 수준 사후 처리를 수행 할 때 유용합니다. 놀랍게도 이것이 기본값입니다.

  • RetentionPolicy.RUNTIME: 버리지 마십시오. 주석은 런타임에 반영 할 수 있어야합니다. 예:@Deprecated

출처 : 이전 URL은 현재 hunter_meta 이고 hunter-meta-2-098036으로 대체되었습니다 . 이 경우에도 페이지 이미지가 업로드됩니다.

이미지 (오른쪽 클릭하고 '새 탭 / 창에서 이미지 열기'를 선택하십시오) Oracle 웹 사이트 스크린 샷


1
인용 해 주셔서 감사합니다. 여기에서 가장 흥미로운 것은 다음의 사용 사례입니다.RetentionPolicy.CLASS
Max

2
RetentionPolicy.class가 왜 흥미롭고 놀랍게도 기본값인지 설명 할 수 있습니까?
sudocoder

1
@sudocoder -이 링크를 참조하십시오 stackoverflow.com/a/5971247/373861stackoverflow.com/a/3849602/373861을 . 이 특정 정책은 바이트 코드 계측에 필요하다고 생각합니다. 나는 그것을 직접 사용하지는 않았지만.
Favonius

마지막 으로이 시리즈의 다음 기사에서는 런타임에 주석을 찾는 데 도움이되도록 Java의 리플렉션 기능이 어떻게 향상되었으며 주석 처리 도구가 "apt"를 통해 빌드시 주석을 사용하는 방법을 보여 드리겠습니다. 이 기사는 어디에 있습니까?
Sushant

@Sushant : 글쎄, 나는 그것이 어디에 있는지 확실하지 않습니다 :). apt더 이상 사용되지 않지만 이 docs.oracle.com/javase/7/docs/technotes/guides/apt/…를 참조하십시오 . 리플렉션을 사용하여 주석을 발견하기 위해 인터넷에 여러 자습서가 있습니다. 당신은에보고 시작할 수 있습니다 java.lang.Class::getAnno*와 유사한 방법 java.lang.reflect.Methodjava.lang.reflect.Field.
Favonius

57

클래스 디 컴파일에 대한 의견에 따르면 다음과 같이 작동합니다.

  • RetentionPolicy.SOURCE: 디 컴파일 된 클래스에 나타나지 않습니다

  • RetentionPolicy.CLASS: 디 컴파일 된 클래스에 나타나지만 다음을 반영하여 런타임에 검사 할 수 없습니다. getAnnotations()

  • RetentionPolicy.RUNTIME: 디 컴파일 된 클래스에 나타나고 다음을 반영하여 런타임에 검사 할 수 있습니다. getAnnotations()


예, 나도 그렇게 생각했지만 디 컴파일 된 클래스에는 아무것도 없습니다! 따라서 본인은은 javap 도구를 사용하여 클래스 파일 검사하려고합니다 ... 혼동하고있어
xdevel2000

javap는 어디에 두지 않습니까?
xdevel2000

1
RetentionPolicy.CLASS의 사용 사례는 무엇입니까?
Rahul

20

최소 실행 가능 예

언어 수준 :

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}

@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}

@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}

public static void main(String[] args) {
    @RetentionSource
    class B {}
    assert B.class.getAnnotations().length == 0;

    @RetentionClass
    class C {}
    assert C.class.getAnnotations().length == 0;

    @RetentionRuntime
    class D {}
    assert D.class.getAnnotations().length == 1;
}

바이트 코드 레벨 : 주석 javapRetention.CLASS달린 클래스가 RuntimeInvisible 클래스 속성을 얻는 것을 관찰했습니다 .

#14 = Utf8               LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
  0: #14()

반면 Retention.RUNTIME주석은 도착 RuntimeVisible 클래스 속성을 :

#14 = Utf8               LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
  0: #14()

그리고 Runtime.SOURCE주석 .class모든 주석을하지 않습니다.

함께 플레이 할 수있는 GitHub의 예 .


따라서 Runtime.SOURCE 및 Runtime.CLASS의 사용은 무엇입니까?
Praveen Kamath

@PraveenKamath 나는 그들이 유용한 곳의 예를 모른다. 대부분의 개발자가 절대하지 않는 저급 JVM 작업을 수행하는 경우에만 발생합니다. 신청서를 찾으면 알려주십시오.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

5

보존 정책 : 보존 정책은 주석을 폐기 할 시점을 결정합니다. Java의 내장 주석을 사용하여 지정됩니다. @Retention[정보]

1.SOURCE: annotation retained only in the source file and is discarded
          during compilation.
2.CLASS: annotation stored in the .class file during compilation,
         not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.

0
  • CLASS : 주석은 컴파일러에 의해 클래스 파일에 기록되지만 런타임에 VM에 의해 유지 될 필요는 없습니다.
  • RUNTIME : 주석은 컴파일러에 의해 클래스 파일에 기록되고 런타임에 VM에 보관되므로, 반영 적으로 읽을 수 있습니다.
  • 출처 : 컴파일러는 주석을 버립니다.

오라클 닥

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