How can I tell at runtime that a Java 1.4 type or member is deprecated?
In Java 6 I can use a technique like this:
@Deprecated
public final class Test {
public static void main(String[] args) {
开发者_Go百科 System.out.println(Test.class.isAnnotationPresent(Deprecated.class));
}
}
to decide if a type is deprecated. Is there any way at all to do this in 1.4 with the old style (Javadoc-based) deprecation?
You can't make such a check on javadoc tags. Well, you can, if you distribute your source code, load the source file and parse it for the @deprecated
tag, but this is not preferable.
The pre-Java5 way of indicating something is by using a marker interface. You can define your own:
public interface Deprecated {
}
and make deprecated classes implement it. You cannot use it on methods, of course.
public final class Test implements Deprecated
And then check whether Deprecated.class.isAssignableFrom(Test.class)
.
But deprecation is a purely indicative notion and should not be used at run-time to differentiate behaviour.
No there is not, as JavaDoc is a comment and as such not available at runtime.
The @deprecated tag is only used by the compiler but not put in the compiled java byte code, so you cannot detect it after compilation.
What is it you want to do?
Actually, you can.
The same pre-1.5 source code, compiled with or without the @deprecated JavaDoc tag, produces class files which differ in a couple of bytes:
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 |........|
If you take a look at the JVM Specification, Chapter 4, there's a Deprecated
attribute (§4.7.15) in the ClassFile
structure.
There're tools capable to determine whether a class is deprecated or not:
- any of the modern IDEs
- jad (the Java decompiler), closed source, purely native code.
- jclasslib project (GPLv2) by Ingo Kegel.
You can either go ahead and implement the ClassFile
structure yourself or, if you have nothing against GPLv2, take a look at org.gjt.jclasslib.structures.AttributeInfo
class.
annotations are available since version 1.5, so that is not possible for 1.4 and previous
精彩评论