默认Java注释值:按规范的相同实例?

默认Java注释值:按规范的相同实例?,java,Java,在我的JRE上,以下测试通过: public static @interface Bar {} @Retention(RetentionPolicy.RUNTIME) public @interface Foo { Bar value() default @Bar; } @Foo public Object default1; @Foo public Object default2; @Foo(@Bar) public Object specified; @Test publi

在我的JRE上,以下测试通过:

public static @interface Bar {}

@Retention(RetentionPolicy.RUNTIME)
public @interface Foo
{
    Bar value() default @Bar;
}

@Foo
public Object default1;

@Foo
public Object default2;

@Foo(@Bar)
public Object specified;

@Test
public void test() throws NoSuchFieldException, NoSuchMethodException
{
    Foo d1 = getClass().getField("default1").getAnnotation(Foo.class);
    Foo d2 = getClass().getField("default2").getAnnotation(Foo.class);
    Foo s = getClass().getField("specified").getAnnotation(Foo.class);
    Assert.assertSame(d1.value(), d2.value());
    Assert.assertNotSame(d1.value(), s.value());
}

这两个断言背后的行为是由Java指定的吗?这是一个可靠的条件来检测开发人员何时提供了一个值(即
等于默认值的值)?

查看Oracle实现中如何存储注释成员的默认值(
java.lang.reflect.Method#annotationDefault
),不确定是否需要实现缓存单个实例。

它们肯定在内部使用相同的代理来表示默认值的注释,而使用不同的代理来表示手动指定的注释。我想说的是,这与实例不同,因为您永远无法实例化注释(或接口),这实际上非常有用。注释的默认值作为
byte[]
序列化到方法中。显然,他们正在缓存一个实例,但我无法想象有人会将该需求放入规范中。谢谢@Makoto您可以创建
注释的实例,就像您可以创建
java.util.Map的实例一样。显然,我们的意思是我们正在创建一个实现该接口的类的实例,但结果对象是该接口的实例。走来走去说“我的方法只有一个参数:java.util.Map的代理”,你会得到奇怪的表情。