为什么java注释语法有()[括号]?

问题描述 投票:0回答:1

为什么在 "java "中,当你声明一个 "注解 "的 "参数 "时,你必须在参数后面加上 "一对括号",反正注解在语法上和 "接口 "的形式 "很不一样",为什么会有这种奇怪的语法......我知道这和注解在幕后使用接口管理有关,但到底是什么?

java annotations
1个回答
0
投票

这就是一个正常的接口声明的样子。

public interface Example {
    String method();
}

请注意,当注解发布的时候,java功能 "接口的默认方法 "还没有出现。在 default 关键字已经存在了(从java 1.0开始就存在了),只是作为一个你可以放在switch block中的东西,作为 "it didnt match any of the cases "的 "case"。

这就是一个注解接口定义的样子。

public @interface Example {
    String method();
}

或者,如果涉及到默认值

public @interface Example {
    String method() default "";
}

请注意,除了"@"符号之外,这两者在解析上没有什么区别。在'default'的情况下;是的,那是全新的,但单看这一点,看起来并不奇怪。括号是,但不是那一点。

之所以这样做,是为了不'爆炸'解析。自从java9中引入了module-info之后,如果你想为java写一个解析器,你多半需要一个'在飞行中切换模式'的解析器;模块文件的 "语言规范 "是如此的截然不同。

但这是很大的一步,目前绝大多数的解析器库都不能很好地处理这个问题,它们不能在解析源文件的过程中切换语法。

即使我可以弹指一挥,打碎java(要明确的是,java一般不会这么做:更新语言,使现有的代码现在不再编译或意味着别的东西,这是一个很大的步骤,由于明显的原因,很少有人采取。不过,它限制了语言设计。这就是成为世界上最流行的语言的代价*)......这里有优势。

注解的工作方式是,如果你在运行时获得一个注解,它的行为就像一个对象,是注解接口的实例。

Example foo = Class.forName("foo.bar.Baz").getAnnotation(Example.class);
System.out.println(foo.method());

请注意,它不是 foo.method. 是啊 foo.method(). 而这有不同的原因:字段,在java中,是二等公民。你不能把它们放在lambda方法引用中(ClassName::methodName 是有效的java;字段没有这样的东西),它们不继承,你不能把它们放在接口中(接口中的字段自动是public、final和static,即常量。它们不会向任何实现类宣示要求,不像接口中的方法)。) 这意味着作为一般原则点的字段在java中的公共API中是不用的。如果在这个实例中它们会被使用,那就太奇怪了。

所以,考虑到params的作用就像args-less方法调用一样,从这个意义上说,你也可以这样声明它们,在一个 @interface 定义:*)给或拿几个点。

(*)给或拿几个点。

© www.soinside.com 2019 - 2024. All rights reserved.