Java-了解注解及其应用

一、注解基本了解和应用

  1、何为注解?

  注解就是一种标记,在程序中加了注解就等于加了标记,没加,就没有标记。

  2、注解有何作用?

  加了注解,java编译器、开发工具或是其他程序可以通过反射技术了解你的类或各种元素是否有标记,有什么标记就做什么

  样的事情。比如:子类重写父类的方法,方法上必须有@override标记;若一个方法已过时不用了,就该方法添加注

  解@Deprecated,调用者反射时就明白这方法已过时

  3、注解在哪标记,也就是说能为哪些元素标记?

  可以在包、类、字段、方法、局部变量

  二、自定义注解及其应用

  1、先定义个注解类,如下代码:


/**

* 自定义注解类

* @author Administrator

*

*/

public @interface AnimTest {

}

  2、将这个注解类应用到某个类上,然后用反射查看判断该类是否被这个注解类所标记


package com.itcast.test;

import com.itcast.zhujie.AnimTest;

@AnimTest   //这是自定义的注解

public class ZhujieTest {

/**

* @param args

*/

public static void main(String[] args) {

boolean isAnim  = ZhujieTest.class.isAnnotationPresent(AnimTest.class);

if(isAnim)

System.out.println("it  has one");

else

System.out.println("no have");

}

}

  输出的结果是:no have ;表示该类没有找到注解标记,这是为何呢?不是在类上已经使用了注解了嘛?

  回答这问题之前,我们先学习一个东西,Retention元注释类,指的是注释类型的注释要留多久。如果某个注释类型没有声明Retention元注释,则保留策略为默认的RetentionPolicy.CLASS,表示保留到编译时,运行时就会被剔除。  RetentionPolicy 是一个枚举类型,有三个值:SOURCE、CLASS 、  RUNTIME 分别对应着Java源文件、class文件、内存中的字节码

  我们在重新看下上个代码,AnimTest 没有声明Retention,故保留默认的CLASS,只保留到编译时期。所以内存中加载类文件时,注解类已被清除,所以才会找不到AnimTest注解类的标记。要想在反射中能找到该标记,只要设置下注解类的保留周期,所以接着改下这个注解类


/**

* 自定义注解类

* @author Administrator

*

*/

@Retention(value = RetentionPolicy.RUNTIME)     //表示运行时也保留该注解类

public @interface AnimTest {

}

  在执行代码,结果是:it  has  one

  3、现在有个问题,就是注解类的使用范围是怎样的呢?只能在类上么?

  其实有个元注释Tagert来限定范围的。Tagert 指的是注释类型所适用的程序元素的种类。如果注释类没有声明Tagert元注释,则可以适用于任何元素上,如果声明了,编译器就会强制实施指定的范围

  如果要使AnimTest只作用于方法上,则在注释类声明Tagert


/**

* 自定义注解类

* @author Administrator

*

*/

@Retention(value = RetentionPolicy.RUNTIME)

@Target(value = {ElementType.METHOD})    //限定范围,作用于方法

public @interface AnimTest {

}

  那么这个注解类就不能作用于类上了,否则会编译异常,只能作用于方法上,代码如下:


public class ZhujieTest {

/**

* @param args

*/

@AnimTest  //作用于方法上

public static void main(String[] args) {

boolean isAnim  = ZhujieTest.class.isAnnotationPresent(AnimTest.class);

if(isAnim)

System.out.println("it  has one");

else

System.out.println("no have");

}

}

  如果注释类既可以使用类上也可以作用 于方法上,只要修改为 @Target(value = {ElementType.METHOD,ElementType.TYPE}),type是表示类型

  三、为注解增加各种属性

  1、现在给注解类添加各种属性,类似接口形式,只提供方法


import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import com.itcast.classdemo.WeekDay;

/**

* 自定义注解类

* @author Administrator

*

*/

@Retention(value = RetentionPolicy.RUNTIME)

@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.ANNOTATION_TYPE})

public @interface AnimTest {

String color();   //字符串

int count();    //整型

int[] arr();   //数组

MetaAnnotation meta() default @MetaAnnotation("very food");  //注释类型

WeekDay day() default WeekDay.MON;   //枚举类型

}

//注释类

public @interface MetaAnnotation {

String value() default "heollo";    //提供默认值

}

//枚举类

public enum WeekDay {

SUN,MON

}

  2、以下是测试注释类调用属性


import com.itcast.zhujie.AnimTest;

@AnimTest (color ="red",count =1,arr=234)   //这是自定义的注解,并为其属性赋值

public class ZhujieTest {

/**

* @param args

*/

@AnimTest (color ="blue",count=2,arr={3,21})

public static void main(String[] args) {

//是否含有AnimTest注释标记

boolean isAnim  = ZhujieTest.class.isAnnotationPresent(AnimTest.class);

if(isAnim){

//获取AnimTest注释标记对象

AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class);

//以下都是获取AnimTest注释标记对象的属性

System.out.println(an.color());  // red

System.out.println(an.count());   //1

System.out.println(Arrays.toString(an.arr()));   //[234]

System.out.println(an.meta().value());   //very good

System.out.println(an.day());            //MON

System.out.println("it  has one");

}else

System.out.println("no have");

}

}

  经上述测试总结:

  1)注释类的属性可以有String、int、数组、枚举和注解

  2)注释类的属性可以设置默认值,如String color() default "red";

  3)在使用注释类时,有属性,但没默认值,这时必须要赋值,否则编译不通                过 @AnimTest (color ="blue",count=2,arr={3,21})

  4)获取类上的注释对象,用反射技术AnimTest an = ZhujieTest.class.getAnnotation(AnimTest.class);

  5)获取注释上的属性,类似调用方法一样,需要带括号;

  6)如果注释类只有一个属性要赋值,且属性名为value,则赋值时属性名和等号都可以省略,如:@MetaAnnotation("very food")

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-12-10 11:07:54

Java-了解注解及其应用的相关文章

Java中注解(Annotation)自定义注解入门

要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: 1.@Target, 2.@Retention, 3.@Documented, 4.@Inherited 这些类型和它们所支持的类在java.lang.annot

java中注解的问题,求大神指教,膜拜

问题描述 java中注解的问题,求大神指教,膜拜 就像这个应该是注解吧.在另一个类中调用属性值得时候,为什么是用的get/set方法,不是在私有化的时候才需要get.set方法么.而且在别人的电脑上能运行,在我的电脑上就报错. 解决方案 因为spring中大多注入的时候都是通过set方法 解决方案二: 那为什么在我的电脑上就报错呢 我自己再把public修改成私有的在加上get/set方法就没事了 解决方案三: 一般来说,定义属性的时候有私有的 通过公有的get/set获取私有属性或者给私有属性

java自定义注解如何使用

问题描述 java自定义注解如何使用 自定义了一个注解类@MyAnnotation,还有解析注解的类. 但是在service里直接添加注解@MyAnnotation到方法上,没有效果,注解没有被解析.请问在web项目里,如何才能扫描到注解,并解析这个注解呢? 解决方案 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以'@注解名'在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解.单值注解.完整注解三

java中注解类的问题,public修饰不用写get/set方法

问题描述 java中注解类的问题,public修饰不用写get/set方法 为什么源码运用注解用public修饰属性,调用的时候用get/set方法,换到我的电脑上一直报错,是什么原因 解决方案 报什么错,把错误代码贴出来,才好解决. 解决方案二: 就是这么写的,在另一个类调用属性的时候用的get方法,不是在私有化的时候才用get方法么,而且在我的电脑上报错,就是报须要创建一个方法的提示的错误,在别的电脑上没错.我把jdk换成了一样的还是不行.我把代码全改成了私有化并且写了get.set方法才不

Java @Deprecated注解的作用及传递性_java

相关知识:Java中三种简单注解介绍和代码实例 一.作用 用 @Deprecated注解的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 二.传递性 如果一个类被使用了@Deprecated注解,在调用这个类的地方IDE会给出提示.但如果调用这个类的字类IDE会进行提示吗? 从实验结果看是不会的.因为采用编辑器插入代码时不会像IDE那样出现提示,这里采用截图,有兴趣的同学可以做下实验. 以上内容

java自定义注解实现前后台参数校验的实例_java

其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 对这个感兴趣的,请好好看,好好学: package sonn.sonnannotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.anno

java自定义注解实现前后台参数校验

  其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class)   下面是我做的 java自定义注解实现前后台参数校验 的代码示例 对这个感兴趣的,请好好看,好好学: package sonn.sonnannotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.

浅谈Java自定义注解和运行时靠反射获取注解_java

java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE) //注解仅

lombok 简化java代码注解

lombok 简化java代码注解 安装lombok插件 以intellij ide为例 File-->Setting-->Plugins-->搜索"lombok plugin",安装后重启ide lombok 注解 lombok 提供的注解不多,可以参考官方视频的讲解和官方文档. Lombok 注解在线帮助文档:https://projectlombok.org/features/index.html 下面介绍几个我常用的 lombok 注解: @Data :注解在

Java中注解(Annotation)的基本概念

什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联 任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射 来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据. Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性, 甚至执行基本编译时检查.从某些方面看,annotation就像修饰符一样被使用,并应