Java アノテーションを理解するために、私は実際に試してみましたが、実行を見るとまだ混乱していますが、疑問はほとんどありませんでした。これが私がやっていることです。注釈を定義する
@Retention(RetentionPolicy.CLASS)
@Target(value=ElementType.TYPE)
public @interface Command {
}
今、私はコマンドを初期化します
Reflections reflections = new Reflections(CMDS_PACKAGE);
Set<Class<?>> allClasses = reflections.getTypesAnnotatedWith(Command.class); // line 2
for (Class clazz : allClasses) {
MYCommand cmd = (MYCommand) clazz.newInstance();
System.out.println(cmd.getClass().getAnnotation(Command.class));// line 6
log.info("loading Command [ {} ]", clazz.getCanonicalName());
}
プログラムを実行すると、6行目が表示されますnull
。ポリシーが RetentionPolicy.RUNTIME
6 行目の場合、正しいコマンドが表示されます。
このプロセスの間、2 行目は、ポリシーに関係なく、正しい Annotated クラスを提供しています。つまり、リフレクションライブラリが無視していることを意味しますか?RetentionPolicy
ほとんどのチュートリアルを読んでも、本当に混乱しています。
私にとって実際の問題は、なぜこの異なる動作なのかということです。ポリシーで注釈を付けた場合RetentionPolicy.CLASS
、実行時に私に与えられるべきではありませんでした。私の理解は間違っていますか、誰かがこれらの両方の理解に関する貴重な情報を共有してください。