以前不知道注解有什么用,现在学到了框架,发现到处都是注解。所以搞明白注解的原理还是很有必要的。

要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。

元注解:

  元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:

1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited

这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。

@Target:

   @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:

1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

  使用实例:  

@Target(ElementType.TYPE)
public @interface Table {/*** 数据表名称注解,默认值为类名称* @return*/public String tableName() default "className";
}@Target(ElementType.FIELD)
public @interface NoDBColumn {}

  注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。

@Retention:

  @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

  Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField"; public boolean defaultDBValue() default false;
}

Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

@Documented:

  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField"; public boolean defaultDBValue() default false;
}

@Inherited:

  @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

  实例代码:

/*** * @author peida**/
@Inherited
public @interface Greeting {public enum FontColor{ BULE,RED,GREEN};String name();FontColor fontColor() default FontColor.GREEN;
}

自定义注解实例

自定义一个注解:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target(ElementType.METHOD)//注解作用于方法
public @interface MyAnnotation {String name()default "张三丰";int abilityNum()default 1;String[] abilityNames()default {"太极拳"};
}

测试代码:测试是否能获取注解的参数

public class TestAnnotation {@MyAnnotation(name="令狐冲",abilityNum=2,abilityNames= {"独孤九剑","吸星大法"})public void people1(String name,int age) {}@MyAnnotation(name="段誉",abilityNum=2,abilityNames= {"凌波微步","六脉神剑"})public void people2(String name,int age) {}@MyAnnotation     //没有配置,则使用默认值public void people3(String name,int age) {}public static void main(String[] args){Method[] methods=TestAnnotation.class.getMethods();//反射获取所有方法for(Method m:methods) { //遍历所有方法if(m.isAnnotationPresent(MyAnnotation.class)) {//判断方法是否有MyAnnotation注解MyAnnotation myAnno=m.getAnnotation(MyAnnotation.class);System.out.print(myAnno.name()+"有" +myAnno.abilityNum()+"个技能: ");for(String abilityName:myAnno.abilityNames()) {System.out.print(abilityName+" ");}System.out.println();}}}
}

输出结果:

段誉有2个技能: 凌波微步 六脉神剑 令狐冲有2个技能: 独孤九剑 吸星大法 张三丰有1个技能: 太极拳 

java自定义注解及获取注解参数相关推荐

  1. java:axis2环境下获取方法参数名的另一种方法

    java本身提供的方法不能获取方法的参数名的,只能获取每个参数的类型 比如: public String concatString(String param1,String param2){retur ...

  2. Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

    首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import jav ...

  3. 海康SDK 通过java接口设置和获取摄像机参数

    以下功能实现需要完成设备初始化,注册,监听和布防的操作,详见CSDNhttps://mp.csdn.net/mp_blog/creation/editor/121543529 海康设备登录 //设备登 ...

  4. Spring AOP自定义注解并获取注解的参数

    环境 springboot:1.5 Intellij IDEA:2021.1 序言 最近有个需求,要做方法层面的权限控制.以前在公司使用的是spring security,然后使用注解 如下: @Pr ...

  5. java获取注解信息_java 自定义注解,获取注解信息

    1.声明注解 @OneAnnotation package com.wdletu.log.test; import java.lang.annotation.*; /** * Created by z ...

  6. Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ

       业务需求需要将http请求参数与返回值采集,考虑使用AOP形式,获取到请求值与返回值之后将数据封装为json字符串发送到rabbitMQ中,消费者消费数据后将处理后的数据保存至mongodb或其 ...

  7. java调用存储过程同时获取[返回参数]和[结果集]

    来源:http://blog.csdn.net/security08/article/details/5148586 执行以下代码,报错: String querySQL = "{?=cal ...

  8. java 自定义注解_Java注解

    前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...

  9. 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

    文章目录 一.设置支持的注解类型 二.注解处理器中打印日志 三.主应用中使用注解 四.注解处理器 获取注解节点 五.博客资源 组件化系列博客 : [Android 组件化]从模块化到组件化 [Andr ...

最新文章

  1. 广泛的信号处理链如何让语音助理“正常工作”
  2. 【Android】JNICALL could not be resolved
  3. 关于可观察性的三大支柱,你应该了解这些
  4. python文件处理,python文件处理
  5. Python的Crypto模块使用:自动输入Shell中的密码
  6. spring mvc学习(35):restful的put
  7. ext4文件系统的delalloc选项造成单次写延迟增加的分析
  8. 非线性回归 - 案例按步骤详解 -(SPSS建模)
  9. hdu 1133 Buy the Ticket(递推+精度精算)
  10. 2021年基金什么时候布局?
  11. 游戏中的影子制作技术
  12. 我真是个懒人,。。。
  13. Python函数相关笔记
  14. 《机械制造工艺学》课程设计任务书
  15. 北斗心脏——高精度时间频率系统
  16. 整数规划遗传算法MATLAB,非线性整数规划的遗传算法Matlab程序
  17. Docker网络之bridge0详解
  18. 图像处理——插值算法
  19. 瑞萨 报错 Section “.monitor2“ overlaps section “.textf“
  20. latex 背景颜色设置

热门文章

  1. 思科开源杀软ClamAV中存在严重的RCE漏洞
  2. 开发人员被苹果公司拒绝删除 Apple ID 数据
  3. mysql nhibernate_NHibernate+MySql常见问题
  4. 第五章第四题(将英里转换成千米)(Conversion from mile to kilometer)
  5. adb对夜神模拟器查看游戏的log
  6. xenserver api java_Xenserver和Vmware
  7. 编写游戏人物、剧情、对话的8大经验总结
  8. 注意办公室的言行礼仪
  9. 在线分享notebook笔记的两种方法
  10. 在matlab图中加国界线,科学网-Matlab 利用m_map加国界线-肖鑫的博文