附近 Java 注解,整夜陆地巨人

发布日期:2022-06-18 17:04    点击次数:110


附近 Java 注解,整夜陆地巨人

一、注解简介

Java注解用于为Java代码提供元数据。

元数据是指用来形容数据的数据,往往小数,即是形容代码间关系,或者代码与其它资源(例如数据库表)之间内在量度的数据。在一些时刻框架中,如Struts、hibernate就无声无息用到了元数据。关于Struts来说,元数据指的是struts-config.xml;对hibernate来说即是hbm文献。以上发扬的几种元数据都是基于xml文献的或者其他相貌的单独设立文献。这么示意有些未便之处。1、与被形容的文献分辩,不利于一致性的爱戴;2、扫数这么的文献都是ASCII文献,莫得显式的类型复旧。基于元数据的平时使用,JDK5.0引入了Annotation的办法来形容元数据。在Java中,元数据以标签的相貌存在于Java代码中,元数据标签的存在并不影响设施代码的编译和实践。简而言之,言而总之,注解即是标签的真谛。

二、若何创建注解

JDK5.0出来后,Java话语中就有了四种类型,即类class、排列enum、接口interface、注解@interface,它们处于吞并级别,Java即是通过注解来示意元数据的。

package com.guor.ClientNew;   public @interface MyAnnotation {     // 界说大家的final静态属性     int age = 25;       // 界说大家的空洞法式     String name(); } 

Java注解实质上即是接口,是秉承了Annotation接口的接口。

三、元注解

元注解是不错注解到注解上的注解,或者说元注解是一种基本注解,它大概应用到其它的注解上头。

元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。

1、@Retention

Retention,汉文释义保留期的真谛

当@Retention应用到注解上的时候,它证明证据了这个注解的生命周期。

RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。 RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到JVM中。 RetentionPolicy.RUNTIME 注解不错保留到设施初始的时候,它会被加载到JVM中。 2、@Documented

顾名思义,这个元注解详情和文档量度。它的作用是大概将注解中的元素包含到Javadoc中去。

3、@Target

表明注解哄骗的场所。

ElementType.ANNOTATION_TYPE 不错给一个注解进行注解 ElementType.CONSTRUCTOR 不错给构造法式进行注解 ElementType.FIELD 不错给属性进行注解 ElementType.LOCAL_VARIABLE 不错给局部变量进行注解 ElementType.METHOD 不错给法式进行注解 ElementType.PACKAGE 不错给一个包进行注解 ElementType.PARAMETER 不错给一个法式内的参数进行注解 ElementType.TYPE 不错给一个类型进行注解,比如类、接口、排列 4、@Inherited

lnherited是秉承的真谛。

如若一个超类被@Inherited注解过的注解进行注解的话,那么如若它的子类莫得被任何注解应用的话,那么这个子类就秉承了超类的注解。

代码实例

5、@Repeatable

Repeatable 当然是可重叠的真谛。@Repeatable 是 Java 1.8 才加进来的,是以算是一个新的特点。

什么样的注解会屡次应用呢?时时是注解的值不错同期取多个。

在活命中一个人往往是具有多种身份,如若我把每种身份当成一种注解该若何使用???

先声明一个Persons类用来包含扫数的身份

@Target(ElementType.TYPE)   @Retention(RetentionPolicy.RUNTIME) public @interface Persons {   Person[] value(); } 

这里@Target是声明Persons注解的作用限制,参数ElementType.Type代表不错给一个类型进行注解,比如类,接口,排列。

@Retention是注解的有用时候,RetentionPolicy.RUNTIME是指设施初始的时候。

Person注解:

@Repeatable(Persons.class) public @interface Person{   String role() default ""; } 

@Repeatable括号内的就突出于用来保存该注解内容的容器。

声明一个Man类,给该类加上一些身份。

@Person(role="CEO") @Person(role="husband") @Person(role="father") @Person(role="son") public class Man {   String name=""; } 

在主法式中看望该注解:

public static void main(String[] args) {     Annotation[] annotations = Man.class.getAnnotations();       System.out.println(annotations.length);     Persons p1=(Persons) annotations[0];     for(Person t:p1.value()){         System.out.println(t.role());     } } 

底下的代码松手输出疏浚,关联词不错先判断是否是相应的注解,比拟严谨。

if(Man.class.isAnnotationPresent(Persons.class)) {     Persons p2=Man.class.getAnnotation(Persons.class);     for(Person t:p2.value()){         System.out.println(t.role());     }  } 

初始松手:

四、注解的属性

注解的属性也叫做成员变量,注解唯独成员变量,莫得法式。注解的成员变量在注解的界说中以“无参的法式”相貌来声明,其法式名界说了该成员变量的名字,其复返值界说了该成员变量的类型。

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation {     int id();     String msg(); } 

上头代码中界说了TestAnnotation这个注解中领有id和msg两个属性。在使用的时候,咱们应该给他们进行赋值。

赋值的款式是在注解的括号内以value=“”相貌,多个属性之前用,离隔。

@TestAnnotation(id=3,msg="hello annotation") public class Test { } 

需要真贵的是,在注解中界说属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。

注解中属性不错有默许值,www.色默许值需要用 default 过错值指定。比如:

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation {     public int id() default -1;     public String msg() default "哪吒"; } 

TestAnnotation 中 id 属性默许值为 -1,msg 属性默许值为 哪吒。

它不错这么应用。

@TestAnnotation() public class Test {} 

因为有默许值,是以无需要再在 @TestAnnotation 后头的括号里面进行赋值了,这一步不错不祥。

另外,还有一种情况。如若一个注解内只是唯唯独个名字为 value 的属性时,应用这个注解时不错径直将属性值填写到括号内。

public @interface Check {     String value(); } 

上头代码中,Check 这个注解唯独 value 这个属性。是以不错这么应用。

@Check("hi") int a; 

这和底下的遵循是相似的

@Check(value="hi") int a; 

终末,还需要真贵的一种情况是一个注解莫得任何属性。比如:

public @interface Perform {} 

那么在应用这个注解的时候,括号都不错不祥。

@Perform public void testMethod(){} 
五、Java自带的注解

学习了上头量度的常识,咱们依然不错我方界说一个注解了。其实 Java 话语自己依然提供了几个现成的注解。

1、@Override

这个大家应该很熟识了,指示子类要复写父类中被 @Override 修饰的法式

2、@Deprecated

加上这个注解之后,示意此法式或类不再忽视使用,调用时会出现删除线,但不代表不行用,只是说,不推选使用,因为有更好的法式不错调用。

那么径直删掉不就罢了?

因为在一个名目中,工程比拟大,代码比拟多,而在后续的缔造历程中,可能之前的某个法式终了的并不是很合理,这个时候要从头写一个法式,而之前的法式还不行粗率删,因为别的场所可能在调用它,是以加上这个注解,就OK啦!

3、@SuppressWarning

拦阻劝诫的真谛。

该批注的作用是给编译器一条指示,告诉它对被批注的代码元素里面的某些劝诫保持静默。

4、@SafeVarargs

参数安全类型注解。

它的操办是提醒缔造者不要用参数做一些不安全的操作,它的存在会拦阻编译器产生unchecked这么的劝诫。

在声明具有暧昧类型(比如:泛型)的可变参数的构造函数或法式时,Java编译器会报unchecked劝诫。鉴于这种情况,如若设施猿料定声明的构造函数和法式的主体no problem,可使用@SafeVarargs进行象征,这么Java编译器就不会报unchecked劝诫了!

5、@FunctionalInterface

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级乌有查验,加上该注解,当你写的接口不安妥函数式接口界说的时候,编译器会报错。

它们主要用在Lambda抒发式和法式援用(践诺上也可觉得是Lambda抒发式)上。

如界说了一个函数式接口如下:

@FunctionalInterface interface GreetingService  {     void sayMessage(String message); } 

那么就不错使用Lambda抒发式来示意该接口的一个终了(注:JAVA 8 之前一般是用匿名类终了的):

GreetingService greetService1  = message -> System.out.println("Hello " + message); 
六、注解的使用场景 1、注解的官方释义

注解是一系列元数据,它提供数据用来证明设施代码,关联词注解并非是所证明的代码自己的一部分。注解关于代码的初始遵循莫得径直影响。

2、注解的用处

① 提供信息给编译器:编译器不错利用注解来探伤乌有或劝诫信息

② 编译阶段时的处置:软件器具不错利用注解信息来生成代码、HTML文档或其它反应处置。

③ 初始时的处置:某些注解不错在设施初始时接纳代码的提炼。

值得真贵的是,注解不是代码自己的一部分。

3、注解的用法例如
public class ExampleUnitTest {     @Test     public void addition_isCorrect() throws Exception {         assertEquals(4, 2 + 2);     } } 

@Test 象征了要进行测试的法式 addition_isCorrect().

还有例如ssm框架等哄骗了大都的注解。

七、注解的实质

注解实质是一个秉承了Annotation的突出接口,其具体终了类是Java初始时生成的动态代理类。通过代理对象调用其自界说注解的法式,最终调用的是AnnotationInvocationHandler的invoke法式,该法式会从memberValues这个map中索引出对应的值,而memberValues的起首是Java常量池。

八、追思

1、注解即是标签,注解为了证明代码

2、注解的基本语法@interface

3、注解的元注解

4、注解的属性

5、注解主要给编译器及器具类型的软件用的

6、注解的提炼要借助于Java的反射时刻,反射比拟慢,是以注解使用时也需要严慎狡计时候本钱

 本文转载自微信公众号「哪吒学Java」,不错通过以下二维码关心。转载本文请量度哪吒学Java公众号。

 

 






Powered by 免费看小12萝裸体视频国产 @2013-2022 RSS地图 HTML地图

栏目分类

热点资讯

相关资讯