2010-01-14 1 views
3

В Java 6 можно использовать технику, как это:Как я могу сказать во время выполнения, что тип или член Java 1.4 устарел?

@Deprecated 
public final class Test { 

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

решить, если тип является устаревшим. Есть ли вообще способ сделать это в 1.4 со старым стилем (на основе Javadoc)?

ответ

4

Вы не можете сделать такую ​​проверку для документирования тегов. Ну, вы можете, если вы распространяете исходный код, загрузите исходный файл и проанализируйте его для тега @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 используется только компилятором, но не помещается в скомпилированный java-байтовый код, поэтому вы не можете его обнаружить после компиляции.

Что вы хотите сделать?

1

Собственно, вы можете.

То же предварительно 1,5 исходный код, составленный с использованием или без @Deprecated JavaDoc тега, производит файлы класса, которые отличаются в несколько байт:

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       |........| 

Если вы взгляните на JVM Specification, Chapter 4, есть Deprecated атрибут (§4.7.15) в структуре ClassFile.

Там вы инструменты, способные определить, является устаревшим ли класс или нет:

  • любой из современных Иды
  • JAD (Java-декомпилятор), с закрытым исходным кодом, чисто машинный код.
  • jclasslib проект (GPLv2) по Ingo Kegel.

Вы можете пойти дальше и реализовать ClassFile структуру самостоятельно или, если вы не имеете ничего против GPLv2, посмотрите на org.gjt.jclasslib.structures.AttributeInfo класса.

+0

Вопрос конкретно задает для этого способ * во время выполнения *. –

+0

В вопросе явно не требуется, чтобы API был общедоступным и документированным. И снова это технически выполнимо, несмотря на то, что механизмы недокументированы и могут быть неподдерживаемыми. Например, если не задействованы какие-либо пользовательские загрузчики классов, вы можете сканировать путь к классам, перебирать записи JAR, пока не найдете требуемый класс, декомпилируйте его с помощью JAD и обработайте выход инструмента регулярными выражениями. – Bass

Смежные вопросы