Как я могу сказать во время выполнения, что тип или член Java 1.4 устарели? - PullRequest
3 голосов
/ 14 января 2010

В Java 6 я могу использовать такую ​​технику:

@Deprecated
public final class Test {

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

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

Ответы [ 5 ]

4 голосов
/ 14 января 2010

Вы не можете выполнить такую ​​проверку тегов Javadoc. Что ж, вы можете, если вы распространяете свой исходный код, загружаете исходный файл и анализируете его для тега @deprecated, но это не является предпочтительным.

Способ указания чего-либо до Java5 заключается в использовании интерфейса маркера. Вы можете определить свой собственный:

public interface Deprecated {
}

и заставить устаревшие классы реализовывать это. Конечно, вы не можете использовать его в методах.

public final class Test implements Deprecated

А затем проверьте, является ли Deprecated.class.isAssignableFrom(Test.class).

Но устаревание является чисто ориентировочным понятием и не должно использоваться во время выполнения для разграничения поведения.

3 голосов
/ 14 января 2010

Тег @deprecated используется только компилятором, но не помещается в скомпилированный байт-код Java, поэтому его невозможно обнаружить после компиляции.

Что ты хочешь делать?

3 голосов
/ 14 января 2010

Нет, нет, поскольку JavaDoc является комментарием и поэтому недоступен во время выполнения.

1 голос
/ 12 августа 2013

На самом деле, вы можете.

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

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, глава 4 , в структуре ClassFile есть атрибут Deprecated ( §4.7.15 ).

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

  • любой из современных IDE
  • jad (декомпилятор Java), с закрытым исходным кодом, чисто нативный код.
  • jclasslib проект (GPLv2) от Инго Кегеля .

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

0 голосов
/ 14 января 2010

аннотации доступны начиная с версии 1.5, так что это невозможно для 1.4 и предыдущих

...