登陆

章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?

admin 2019-09-07 171人围观 ,发现0个评论

什么是注解?

用一个词就能够描绘注解,那便是元数据,即一种描绘数据的数据。所以,能够说注解便是源代码的元数据。比方,下面这段代码:

上面的代码中,我重写了toString()办法并运用了@Override注解。可是,即便我不运用@Override注解符号代码,程序也能够正常履行。

那么,该注解表明什么?这么写有什么优点吗?事实上,@Override告知编译器这个办法是一个重写办法(描绘办法的元数据),假设父类中不存在该办法,编译器便会报错,提示该办法没有重写父类中的办法。

假设我不小心拼写错误,例如将toString()写成了toStrring(){double r},而且我也没有运用@Override注解,那程序仍然能编译运章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?转。但运转成果会和我期望的大不相同。现在咱们了解了什么是注解,而且运用注解有助于阅读程序。

Annotation是一种运用于类、办法、参数、变量、结构器及包声明中的特别修饰符。它是一种由JSR-175规范挑选用来描绘元数据的一种东西。

为什么要引进注解?

运用Annotation之前(乃至在运用之后),XML被广泛的运用于描绘元数据。不知何时开端一些运用开发人员和架构师发现XML的保护越来越糟糕了。

他们期望运用一些和代码紧耦合的东西,而不是像XML那样和代码是松耦合的(在某些情况下乃至是彻底别离的)代码描绘。

假设你在Google中查找“XML vs. annotations”,会看到许多关于这个问题的争辩。最风趣的是XML装备其实便是为了别离代码和装备而引进的。

上述两种观念或许会让你很疑问,两者观念好像构成了一种循环,但各有利害。下面咱们经过一个比如来了解这两者的差异。

假设你想为运用设置许多的常量或参数,这种情况下,XML是一个很好的挑选,由于它不会同特定的代码相连。假设你想把某个办法声明为服务,那么运用Annotation会更好一些,由于这种情况下需求注解和办法严密耦合起来,开发人员也有必要认识到这点。

另一个很重要的要素是Annotation界说了一种规范的描绘元数据的办法。在这之前,开发人员一般运用他们自己的办法界说元数据。例如,运用符号interfaces,注释,transient关键字等等。每个程序员依照自己的办法界说元数据,而不像Annotation这种规范的办法。

现在,许多结构将XML和Annotation两种办法结合运用,平衡两者之间的利害。

Annotation是怎样作业的?怎样编写自界说的Annotation?

在叙述这部分之前,主张你首要下载Annotation的示例代码AnnotationsSample.zip 。下载之后放在你习气运用的IDE中,这些代码会协助你更好的了解Annotation机制。重视Java技能栈微信大众号,在后台回复关键字:Java,能够获取一份栈长收拾的 Java 最新技能宝典。

编写Annotation十分简略,能够将Annotation的界说同接口的界说进行比较。咱们来看两个比如:一个是规范的注解@Override,另一个是用户自界说注解@Todo。

关于@Override注释你或许有些疑问,它什么都没做,那它是怎样查看在父类中有一个同名的函数呢。当然,不要惊奇,我是逗你玩的。

@Override注解的界说不只是只要这么一点代码。这部分内容很重要,我不得不再次重复:Annotations只是是元数据,和事务逻辑无关。

了解起来有点困难,但便是这样。假设Annotations不包括事务逻辑,那么有必要有人来完成这些逻辑。元数据的用户来做这个作业。Annotations只是供给它界说的特点(类/办法/包/域)的信息。Annotations的用户(同样是一些代码)来读取这些信息并完成必要的逻辑。

当咱们运用Java的标示Annotations(例如@Override)时,JVM便是一个用户,它在字节码层面作业。到这儿,运用开发人员还不能操控也不能运用自界说的注解。因而,咱们解说一下怎样编写自界说的Annotations。

咱们来逐一叙述编写自界说Annotations的关键。上面的比如中,你看到一些注解运用在注解上。

J2SE5.0版别在 java.lang.annotation供给了四种元注解,专门注解其他的注解:

@Documented–一个简略的Annotations符号注解,表明是否将注解信息增加在java文档中。

@Retention– 界说该注解的生命周期。

RetentionPolicy.SOURCE – 在编译阶段丢掉。这些注解在编译完毕之后就不再有任何含义,所以它们不会写入字节码。@Override, @SuppressWarnings都归于这类注解。

RetentionPolicy.CLASS – 在类加载的时分丢掉。在字节码文件的处理中有用。注解默许运用这种办法。

RetentionPolicy.RUNTIME– 一直不会丢掉,运转期也保存该注解,因而能够运用反射机制读取该注解的信息。咱们自界说的注解一般运用这种办法。

@Target – 表明该注解用于什么当地。假设不明确指出,该注解能够放在任何当地。以下是一些可用的参数。需求阐明的是:特点的注解是兼容的,假设你想给7个特点都增加注解,只是扫除一个特点,那么你需求在界说target包括全部的特点。

@Inherited – 界说该注释和子类的联络

那么,注解的内部到底是怎样界说的呢?Annotations只支撑根本类型、String及枚举类型。注释中全部的特点被界说成办法,并答应供给默许值。

下面的比如演示了怎样运用上面的注解。

假设注解中只要一个特点,能够直接命名为“value”,运用时无需再标明特点名。

但现在为止全部看起来都还不错。咱们界说了自己的注解并将其运用章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?在事务逻辑的办法上。现在咱们需求写一个用户程序调用咱们的注解章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?。这儿咱们需求运用反射机制。假设你了解反射代码,就会知道反射能够供给类名、办法和实例变量目标。

全部这些目标都有getAnnotation()这个办法用来回来注解信息。咱们需求把这个目标转换为咱们自界说的注释(运用 instanceOf()查看之后),一起也能够调用自界说注释里边的办法。看看以下的实例代码,运用了上面的注解:

注解用例

注解的功用很强壮,Spring和Hebernate这些结构在日志和有效性中许多运用了注解功用。注解能够运用在运用符号接口的当地。不同的是符号接口用来界说完好的类,但你能够为单个的办法界说注释,例如是否将一个办法露出为服务。

在最新的servlet3.0中引进了许多新的注解,尤其是和servlet安全相关的注解。

HandlesTypes –该注解用来表明一组传递给ServletContainerInitializer的运用类。

HttpConstraint – 该注解代表全部HTTP办法的运用恳求的安全束缚,和ServletSecurity注释中界说的H章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?ttpMethodConstraint安全束缚不同。

HttpMethodConstraint – 指明不同类型恳求的安全束缚,和ServletSecurity 注解中描绘HTTP协议办法类型的注释不同。

MultipartConfig –该注解标示在Servlet上面,表明该Servlet期望处理的恳求的 MIME 类型是 multipart/form-data。

ServletSecurity 该注解标示在Servlet承继类上面,强制该HTTP协议恳求遵从安全束缚。

WebFilter – 该注解用来声明一个Server过滤器;

WebInitParam – 该注解用来声明Servlet或是过滤器的中的初始化参数,一般合作 @WebServlet 或许 @WebFilter 运用。

WebListener –该注解为Web运用程序上章鱼彩票app-鸿卓课工场—Java 中的注解到底是怎么作业的?下文中不同类型的事情声明监听器。

WebServlet –该注解用来声重生女修仙传明一个Servlet的装备。

ADF (运用程序结构)和注解

现在咱们开端评论文章的最终一部分了。运用程序结构,被称为ADF,由Oracle开发用来创立Oracle交融运用。咱们现已了解了注解的优缺点,也知道怎样编写自界说的注解,但咱们应该将注解运用在ADF的哪部分呢?ADF是否供给了一些朴素的注解?

很好的问题,确真实ADF中许多运用注解有一些约束。之前说到的运用结构如Spring和Hibernate运用AOP(面向旁边面的程序设计)。在AOP中,结构供给了一种机制,在事情的预处理和后续处理中注入代码。

例如:你有一个钩子用来在办法履行之前和之后增加代码,所以你能够在这些当地编写你的用户代码。ADF不运用AOP。假设咱们有任何注解的用例可用,咱们或许需求经过承继的办法完成。

文字与图片来源于网络

如有侵权请联络作者删去

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP