3

在 Java 6 中,我可以使用这样的技术:

@Deprecated
public final class Test {

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

决定一个类型是否被弃用。有没有办法在 1.4 中使用旧式(基于 Javadoc)弃用来做到这一点?

4

5 回答 5

4

您不能对 javadoc 标记进行此类检查。好吧,如果您分发源代码,则可以加载源文件并解析它的@deprecated标签,但这不是可取的。

Java5之前的指示方式是使用标记接口。您可以定义自己的:

public interface Deprecated {
}

并使已弃用的类实现它。当然,您不能在方法上使用它。

public final class Test implements Deprecated

然后检查是否Deprecated.class.isAssignableFrom(Test.class).

但弃用是一个纯粹的指示性概念,不应在运行时用于区分行为。

于 2010-01-14T10:57:57.913 回答
3

不,没有,因为 JavaDoc 是注释,因此在运行时不可用。

于 2010-01-14T10:39:04.903 回答
3

@deprecated 标签仅供编译器使用,并没有放入编译后的 java 字节码中,所以编译后无法检测到。

你想做什么?

于 2010-01-14T11:13:53.680 回答
1

事实上,你可以。

相同的 pre-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 规范,第 4 章,结构中有一个Deprecated属性(第 4.7.15 节ClassFile

有一些工具能够确定一个类是否被弃用:

  • 任何现代 IDE
  • jad(Java 反编译器),封闭源代码,纯本机代码。
  • Ingo Kegel的jclasslib项目 (GPLv2) 。

您可以继续ClassFile自己实现该结构,或者,如果您对 GPLv2 没有任何反对意见,请查看org.gjt.jclasslib.structures.AttributeInfo类。

于 2013-08-12T16:47:10.950 回答
0

注释从 1.5 版本开始可用,因此对于 1.4 和以前的版本是不可能的

于 2010-01-14T10:47:41.020 回答