3

Java 6では、次のような手法を使用できます。

@Deprecated
public final class Test {

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

タイプが非推奨になるかどうかを決定します。古いスタイル(Javadocベース)の非推奨で1.4でこれを行う方法はありますか?

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

実際、できます。

@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仕様の第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 に答える