1987WEB视界-分享互联网热点话题和事件

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

java基础-注解

1987web2024-03-25WEB开发44
以下为本人的学习笔记1.认识AnnotationJDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的

以下为本人的学习笔记 1.认识Annotation JDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有逻辑的情况下,被读取(通过反射来读取),并执行相应 的处理,通过使用An ...

以下为本人的学习笔记

1.认识Annotation

JDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有逻辑的情况下,被读取(通过反射来读取),并执行相应 的处理,通过使用Annotation,程序员可以在源文件中嵌入一些补充从信息。代码分析工具,开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。Annotation类似于修饰符一样被使用,可以用于包,类,构造方法,方法,成员变量,局部变量的声明。

元数据可以说是一个属性,解释数据的数据。如一个属性age的值为18,那么这个解释18的字段age就是元数据。

注解也可以说是一个描述信息,把信息再解析。

注解的本质是标记,他所有的功能都依赖于对于这个注解解释性的代码,通常需要结合反射来编写解释下代码。

注意:

Annotation是一个接口

java.lang.Annotation接口

2.系统定义的Annotation

在JDK1.5之后,在系统中提供了三个Annotation,分别是:@Override(译:覆盖)、@Deprecated(译:已弃用)、@SupperssWarings。

@Override

表示验证当前的方法是否覆盖超类中的方法(即重写父类方法)。如果你一不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示

@Deprecated

表示的是一个类或方法已经不再建议继续使用了,标记为已过时

@SupperssWarings

表示关闭不当的编译器警告信息

Annotation说明@SupperssWarings("unchecked")未检查的转化,如集合没有指定类型@SupperssWarings("unused")未使用的变量@SupperssWarings("resource")有泛型未指定类型@SupperssWarings("path")在类路径,原文件路径中有不存在的路径@SupperssWarings("deprecation")使用了某些不赞成使用的类和方法@SupperssWarings("fallthrough")switch语句执行到底没有break关键字@SupperssWarings("serial")某类实现Serializable但是没有定义serialVersionUID这个需要但是不必须的字段@SupperssWarings("rawtypes")没有传递带有泛型的参数@SupperssWarings("all")全部类型的警告(用这一条就够了)3.自定义Annotation

注解应用三个步骤:

1)编写注解

2)在类上应用注解

3)对应用了注解的类进行反射操作的类

自定义Annotation的语法如下:

访问控制权限@interface Annotation 名称{}

@interface: 定义一个注解的关键字

例如:

public @interface MyAnnotation{}

//1.自定义注解//表示该注解的作用范围在运行时存在@Retention(RetentionPolicy.RUNTIME)//用于生成文档@Documented//用于表示注解的应用范围(类型,方法,属性,构造器,参数,局部变量,包,Annotation)@Target(ElementType.TYPE)@Inherited//子类可继承public@interfaceMyAnnotation{//定义变量,注意:变量后要加括号(),且调用此注解时必须设置变量名publicStringname();publicintage()default2;//给变量设置默认值publicString[]like();//定义一个数组,调用此注解时变量名要含大括号{}publicCOlorcolor();//定义一个枚举类型的变量}publicenumColor{RED,GREEN,BLUE;}//2.使用注解@MyAnnotation(name="wan",like={"金鱼","草鱼"},color=Color.RED)publicclassCat{privateStringname;privateintage;publicString[]like;privateColorcolor;...(构造方法,getter(),setter())}publicclassAnnotationDemo{/**反射来处理注解*/@Testpublicvoidtest2(){Class<Cat>catClass=Cat.class;//获取类上应用的指定注解MyAnnotationannotation=CatClass.getAnnotation(MyAnnotation.class);//获取注解上变量值Stringname=annotation.name();intage=annotation.age();Colorcolor=annotation.color();String[]like=annotation.like();try{//通过反射实例化对象,调用对象的方法存储注解上的值Catcat=catClass.newInstance();cat.setName(name);cat.setAge(age);cat.setLike(like);cat.setColor(color);System.out.println(cat);}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}}}4.Retention和RetentionPolicy

Annotation要想决定其作用的范围,通过@Retention(译:保持)指定,而Retention指定的范围由RetentionPolicy(policy,译:方针,政策,原则)决定,RetentionPolicy指定了三种范围:

范围说明public static final RetentionPolicySOURCE在java源程序中存在(提供给编译器使用)public static final RetentionPolicyCLASS在java生成的class存在public static final RetentionPolicyRUNTIEM在java运行的时候存在(我们通常使用这个范围)

示例:

@Retention(value = RetentionPolicy.RUNTIME)

public@interfaceMyAnnotation{

public String name();

}

5.反射与Annotation

一个Annotation真正起作用,必须结合反射机制,在反射中提供了以下的操作方法:

java.lang.reflect.AccessibleObject(供虚拟机使用)

Method说明public boolean isAnnotationPresent(Class annotationClass) (present,译:目前,出现)判断是否是指定的Annotationpublic Annotation[] getAnnotations()得到全部的Annotation

注解在目前而言最主流的应用就是代替配置文件,例如Spring、SpringBoot等,注解具有开发效率高,成本低的特点,缺点是耦合性高,不利于维护

6.@Documented注解

此注解表示的是文档化,可以在生成doc文档的时候添加注解,即生成文档时,注释一起生成

7.@Target注解

@Target注解(用来注释注解)表示的是一个Annotation的使用范围,例如:之前定义的MyAnnotation可以在任意的位置上使用(没有写这个注解,就所有地方可以使用)

范围说明public static final ElementType TYPE只能在类或接口或枚举上使用public static final ElementType FIELD在成员变量中使用public static final ElementType METHOD在方法中使用public static final ElementType PARAMETER在参数上使用public static final ElementType CONSTRUCTOR在构造中使用public static final ElementType LOCAL_VARIABLE局部变量上使用public static final ElementType ANNOTATION_TYPE只能在Annotation中使用public static final ElementType PACKAGE只能在包中使用8.@Inherited注解

@Inherited表示一个Annotation是否允许被其子类继承下来(使用时表示允许)

■免责申明⒈ 本站是纯粹个人学习网站,与朋友交流共赏,不存在任何商业目的。⒉ 本站利用了部分网络资源,版权归原作者及网站所有,如果您对本站所载文章及作品版权的归属存有异议,请立即通知我们,我们将在第一时间予以删除,同时向你表示歉意!