2010-01-14 2 views
3

자바 6에서 나는이 같은 기술을 사용할 수 있습니다 : 유형은 더 이상 사용되지 않은 경우런타임시 Java 1.4 형식 또는 멤버가 사용되지 않는다는 것을 어떻게 알 수 있습니까?

@Deprecated 
public final class Test { 

    public static void main(String[] args) { 
     System.out.println(Test.class.isAnnotationPresent(Deprecated.class)); 
    } 
} 

결정 할 수 있습니다. 이전 스타일 (Javadoc 기반)을 사용하여 1.4에서이 작업을 수행 할 수있는 방법이 있습니까?

답변

4

당신은 javadoc의 태그에 이러한 확인을 할 수 없기 수 없습니다. 음, 소스 코드를 배포하고 소스 파일을로드 한 다음 @deprecated 태그로 파싱 할 수는 있지만 바람직하지 않습니다.

Java5 이전의 방법은 마커 인터페이스를 사용하는 것입니다. 당신 자신을 정의 할 수 있습니다 :

public interface Deprecated { 
} 

그리고 더 이상 사용되지 않는 클래스가 그것을 구현합니다. 물론 메서드에서는 사용할 수 없습니다.

public final class Test implements Deprecated 

그런 다음 Deprecated.class.isAssignableFrom(Test.class)을 확인하십시오.

그러나 비추천은 전적으로 표기된 개념이므로 동작을 구분하기 위해 런타임에 사용해서는 안됩니다.

3

아니요, JavaDoc은 주석이므로 런타임에는 사용할 수 없습니다.

0

주석 버전 1.5부터 사용할 수있는, 그래서 1.4 및 이전

3

@deprecated 태그는 컴파일러에서만 사용되지만 컴파일 된 자바 바이트 코드에는 넣지 않으므로 컴파일 한 후에는 검색 할 수 없습니다.

원하는 것을 원하십니까?

1

사실, 가능합니다.

00000000 ca fe ba be 00 00 00 34 00 0a 07 00 02 01 00 02 |.......4........| 
00000010 43 30 07 00 04 01 00 10 6a 61 76 61 2f 6c 61 6e |C0......java/lan| 
00000020 67 2f 4f 62 6a 65 63 74 01 00 06 3c 69 6e 69 74 |g/Object...<init| 
00000030 3e 01 00 03 28 29 56 01 00 04 43 6f 64 65 0a 00 |>...()V...Code..| 
00000040 03 00 09 0c 00 05 00 06 00 20 00 01 00 03 00 00 |......... ......| 
00000050 00 00 00 01 00 00 00 05 00 06 00 01 00 07 00 00 |................| 
00000060 00 11 00 01 00 01 00 00 00 05 2a b7 00 08 b1 00 |..........*.....| 
00000070 00 00 00 00 00         |.....| 

00000000 ca fe ba be 00 00 00 34 00 0b 07 00 02 01 00 02 |.......4........| 
00000010 43 30 07 00 04 01 00 10 6a 61 76 61 2f 6c 61 6e |C0......java/lan| 
00000020 67 2f 4f 62 6a 65 63 74 01 00 06 3c 69 6e 69 74 |g/Object...<init| 
00000030 3e 01 00 03 28 29 56 01 00 04 43 6f 64 65 0a 00 |>...()V...Code..| 
00000040 03 00 09 0c 00 05 00 06 01 00 0a 44 65 70 72 65 |...........Depre| 
00000050 63 61 74 65 64 00 20 00 01 00 03 00 00 00 00 00 |cated. .........| 
00000060 01 00 00 00 05 00 06 00 01 00 07 00 00 00 11 00 |................| 
00000070 01 00 01 00 00 00 05 2a b7 00 08 b1 00 00 00 00 |.......*........| 
00000080 00 01 00 0a 00 00 00 00       |........| 

당신이 만약

대 : 함께 또는 @deprecated의 JavaDoc 태그없이 컴파일

같은 사전 1.5 소스 코드, 바이트의 몇 다른 클래스 파일을 생성 JVM Specification, Chapter 4을 살펴보면 ClassFile 구조에 Deprecated 속성 (§4.7.15)이 있습니다. 할 수

거기 도구는 클래스가 사용되지할지 여부를 결정합니다 :

  • 현대의 IDE
  • JAD (자바 디 컴파일러)의

    은 순수 네이티브 코드, 소스를 마감했다.
  • jclasslib 프로젝트 (GPLv2) by Ingo Kegel.

당신은 계속 진행하여 ClassFile 구조를 직접 구현하거나, 당신은 GPLv2에 대한 아무것도없는 경우, org.gjt.jclasslib.structures.AttributeInfo 클래스를 살펴 할 수 있습니다.

+0

질문은 * runtime *에서이 작업을 수행 할 방법을 구체적으로 묻습니다. –

+0

질문에 명시 적으로 API가 공개되고 문서화되어야한다는 것은 아닙니다. 다시 한번 말하지만 이것은 메커니즘이 문서화되지 않았고 지원되지 않을 수도 있음에도 불구하고 기술적으로 실현 가능합니다. 예를 들어, 사용자 정의 클래스 로더가 포함되어 있지 않으면 클래스 경로를 스캔하고 필요한 클래스를 찾을 때까지 JAR 항목을 반복하고 JAD로 디 컴파일 한 후 정규 표현식으로 도구 출력을 처리 할 수 ​​있습니다. – Bass

관련 문제