在Java 6中,我可以使用这样的技术:
@Deprecated
public final class Test {
public static void main(String[] args) {
System.out.println(Test.class.isAnnotationPresent(Deprecated.class));
}
}
决定是否弃用某种类型。有没有办法在1.4中使用旧样式(基于Javadoc的)弃用?
答案 0 :(得分:4)
您无法对javadoc标记进行此类检查。好吧,如果您分发源代码,可以加载源文件并解析@deprecated
标记,但这不是首选。
Java5之前的指示方式是使用标记接口。您可以定义自己的:
public interface Deprecated {
}
并使弃用的类实现它。当然,你不能在方法上使用它。
public final class Test implements Deprecated
然后检查Deprecated.class.isAssignableFrom(Test.class)
。
但弃用只是一个纯粹的指示性概念,不应在运行时用于区分行为。
答案 1 :(得分:3)
没有,因为JavaDoc是评论,因此在运行时不可用。
答案 2 :(得分:3)
@deprecated标记仅由编译器使用,但不会放入已编译的java字节代码中,因此在编译后无法检测到它。
你想做什么?
答案 3 :(得分:1)
实际上,你可以。
使用或不使用@deprecated JavaDoc标记编译的相同的1.5之前的源代码会生成几个字节不同的类文件:
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 |.....|
VS
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
结构中有ClassFile
属性(§4.7.15)。
有些工具可以确定某个类是否已被弃用:
您可以自己继续实施ClassFile
结构,如果您对GPLv2没有任何反对意见,请查看org.gjt.jclasslib.structures.AttributeInfo
类。
答案 4 :(得分:0)
注释可用,因此1.4和之前的
是不可能的