1. Java注解(Annotation)

Java注解是附加在代码中的一些元信息,用于一些工具在编译、

运行时进行解析和使用,起到说明、配置的功能。

注解相关类都包含在java.lang.annotation包中。

2. Java注解分类

2.1 JDK基本注解

2.2 JDK元注解

2.3 自定义注解

3. JDK基本注解

3.1 @Override

重写

3.2 @Deprecated

已过时

3.3 @SuppressWarnings(value = "unchecked")

压制编辑器警告

Java元注解

作用:元注解用于修饰其他的注解

@Retention:定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)             //注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS)              //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

@Retention(RetentionPolicy.RUNTIME)            //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)

@Target(ElementType.TYPE)                      //接口、类

@Target(ElementType.FIELD)                     //属性

@Target(ElementType.METHOD)                    //方法

@Target(ElementType.PARAMETER)                 //方法参数

@Target(ElementType.CONSTRUCTOR)               //构造函数

@Target(ElementType.LOCAL_VARIABLE)            //局部变量

@Target(ElementType.ANNOTATION_TYPE)           //注解

@Target(ElementType.PACKAGE)                   //包

注:可以指定多个位置,例如:

@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用

@Inherited:指定被修饰的Annotation将具有继承性

@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.

自定义注解

注解分类(根据Annotation是否包含成员变量,可以把Annotation分为两类):

标记Annotation:

没有成员变量的Annotation; 这种Annotation仅利用自身的存在与否来提供信息

元数据Annotation:

包含成员变量的Annotation; 它们可以接受(和提供)更多的元数据;

如何自定义注解?

使用@interface关键字,其定义过程与定义接口非常类似,需要注意的是:

Annotation的成员变量在Annotation定义中是以无参的方法形式来声明的,其方法名和返回值类型定义了该成员变量的名字和类型,

而且我们还可以使用default关键字为这个成员变量设定默认值;

注意:只有名字为“value”属性,赋值时可以省略属性名

案例一(获取类与方法上的注解值)

packagecom.ssm.yuan.p1;public enumTranscationModel {

Read, Write, ReadWrite

}

1 packagecom.ssm.yuan.p1;2

3 import java.lang.annotation.*;4

5 /**

6 *7 * MyAnnotation3注解可以用在方法上8 * 注解运行期也保留9 * 可继承10 */

11 @Target(ElementType.METHOD)12 @Retention(RetentionPolicy.RUNTIME)13 @Inherited14 @Documented15 public @interfaceMyAnnotation3 {16 TranscationModel[] models() defaultTranscationModel.ReadWrite;17 }

1 packagecom.ssm.yuan.p1;2

3 import java.lang.annotation.*;4

5 /**

6 *7 * MyAnnotation2注解可以用在方法上8 * 注解运行期也保留9 * 不可继承10 */

11 @Target(ElementType.METHOD)12 @Retention(RetentionPolicy.RUNTIME)13 @Documented14 public @interfaceMyAnnotation2 {15 TranscationModel model() defaultTranscationModel.ReadWrite;16 }

1 packagecom.ssm.yuan.p1;2

3 import java.lang.annotation.*;4

5 /**

6 *7 * MyAnnotation1注解可以用在类、接口、属性、方法上8 * 注解运行期也保留9 * 不可继承10 */

11 @Target({ElementType.TYPE, ElementType.FIELD,ElementType.METHOD})12 @Retention(RetentionPolicy.RUNTIME)13 @Documented14 public @interfaceMyAnnotation1 {15 String name();16 }

1 packagecom.ssm.yuan.p1;2

3 importorg.junit.Test;4

5 /**

6 *7 */

8 public classDemo1Test {9 @Test10 public void list() throwsException {11 //获取类上的注解

12 MyAnnotation1 annotation1 = Demo1.class.getAnnotation(MyAnnotation1.class);13 System.out.println(annotation1.name());//abc14

15 //获取方法上的注解

16 MyAnnotation2 myAnnotation2 = Demo1.class.getMethod("list").getAnnotation(MyAnnotation2.class);17 System.out.println(myAnnotation2.model());//Read

18

19

20

21 }22

23 @Test24 public void edit() throwsException {25 MyAnnotation3 myAnnotation3 = Demo1.class.getMethod("edit").getAnnotation(MyAnnotation3.class);26 for(TranscationModel model : myAnnotation3.models()) {27 System.out.println(model);//Read,Write

28 }29 }30 }

1 packagecom.ssm.yuan.p1;2

3 /**

4 *5 * 获取类与方法上的注解值6 */

7 @MyAnnotation1(name = "abc")8 public classDemo1 {9

10 @MyAnnotation1(name = "xyz")11 privateInteger age;12

13 @MyAnnotation2(model =TranscationModel.Read)14 public voidlist() {15 System.out.println("list");16 }17

18 @MyAnnotation3(models ={TranscationModel.Read, TranscationModel.Write})19 public voidedit() {20 System.out.println("edit");21 }22 }

案例一测试结果

案例二(获取类属性上的注解属性值)

1 packagecom.ssm.yuan.p2;2

3 importjava.lang.annotation.ElementType;4 importjava.lang.annotation.Retention;5 importjava.lang.annotation.RetentionPolicy;6 importjava.lang.annotation.Target;7

8 /**

9 */

10 //@Retention(RetentionPolicy.SOURCE)

11 @Retention(RetentionPolicy.RUNTIME)12 @Target(ElementType.FIELD)13 public @interfaceTestAnnotation {14 String value() default "默认value值";15

16 String what() default "这里是默认的what属性对应的值";17 }

1 packagecom.ssm.yuan.p2;2

3 /**

4 *5 * 获取类属性上的注解属性值6 */

7 public classDemo2 {8 @TestAnnotation(value = "这就是value对应的值_msg1", what = "这就是what对应的值_msg1")9 private staticString msg1;10

11 @TestAnnotation("这就是value对应的值1")12 private staticString msg2;13

14 @TestAnnotation(value = "这就是value对应的值2")15 private staticString msg3;16

17 @TestAnnotation(what = "这就是what对应的值")18 private staticString msg4;19 }

1 packagecom.ssm.yuan.p2;2

3 importorg.junit.Test;4

5 /**

6 */

7 public classDemo2Test {8 @Test9 public void test1() throwsException {10 TestAnnotation msg1 = Demo2.class.getDeclaredField("msg1").getAnnotation(TestAnnotation.class);11 System.out.println(msg1.value());12 System.out.println(msg1.what());13 }14

15 @Test16 public void test2() throwsException{17 TestAnnotation msg2 = Demo2.class.getDeclaredField("msg2").getAnnotation(TestAnnotation.class);18 System.out.println(msg2.value());19 System.out.println(msg2.what());20 }21

22 @Test23 public void test3() throwsException{24 TestAnnotation msg3 = Demo2.class.getDeclaredField("msg3").getAnnotation(TestAnnotation.class);25 System.out.println(msg3.value());26 System.out.println(msg3.what());27 }28

29 @Test30 public void test4() throwsException{31 TestAnnotation msg4 = Demo2.class.getDeclaredField("msg4").getAnnotation(TestAnnotation.class);32 System.out.println(msg4.value());33 System.out.println(msg4.what());34 }35 }

案例三(获取参数修饰注解对应的属性值)

1 packagecom.ssm.yuan.p3;2

3 import java.lang.annotation.*;4

5 /**

6 *7 * 非空注解:使用在方法的参数上,false表示此参数可以为空,true不能为空8 */

9 @Documented10 @Target({ElementType.PARAMETER})11 @Retention(RetentionPolicy.RUNTIME)12 public @interfaceIsNotNull {13 boolean value() default false;14 }

1 packagecom.ssm.yuan.p3;2

3 /**

4 *5 * 获取参数修饰注解对应的属性值6 */

7 public classDemo3 {8

9 public void hello1(@IsNotNull(true) String name, @IsNotNull(false) Integer age) {10 System.out.println("hello:" +name);11 }12

13 public voidhello2(@IsNotNull String name) {14 System.out.println("hello:" +name);15 }16 }

1 packagecom.ssm.yuan.p3;2

3 importorg.junit.Test;4

5 importjava.lang.reflect.Parameter;6

7 /**

8 */

9 public classDemo3Test {10

11 @Test12 public void hello1() throwsException {13 Demo3 demo3 = newDemo3();14 for (Parameter parameter : demo3.getClass().getMethod("hello1", String.class, Integer.class).getParameters()) {15 IsNotNull annotation = parameter.getAnnotation(IsNotNull.class);16 if(annotation != null){17 System.out.println(annotation.value());//true

18 }19 }20 }21

22 @Test23 public void hello2() throwsException {24 Demo3 demo3 = newDemo3();25 for (Parameter parameter : demo3.getClass().getMethod("hello2", String.class).getParameters()) {26 IsNotNull annotation = parameter.getAnnotation(IsNotNull.class);27 if(annotation != null){28 System.out.println(annotation.value());//false

29 }30 }31 }32 }

Aop自定义注解的应用

1 packagecom.ssm.yuan.springaop;2

3 importjava.lang.annotation.ElementType;4 importjava.lang.annotation.Retention;5 importjava.lang.annotation.RetentionPolicy;6 importjava.lang.annotation.Target;7

8 /**

9 */

10 @Target(ElementType.METHOD)11 @Retention(RetentionPolicy.RUNTIME)12 public @interfaceMyLog {13 String desc();14 }

1 packagecom.ssm.yuan.component;2

3 importcom.ssm.yuan.springaop.MyLog;4 importorg.aspectj.lang.JoinPoint;5 importorg.aspectj.lang.annotation.Aspect;6 importorg.aspectj.lang.annotation.Before;7 importorg.aspectj.lang.annotation.Pointcut;8 importorg.aspectj.lang.reflect.MethodSignature;9 importorg.slf4j.Logger;10 importorg.slf4j.LoggerFactory;11 importorg.springframework.stereotype.Component;12

13 /**

14 */

15 @Component16 @Aspect17 public classMyLogAspect {18 private static final Logger logger = LoggerFactory.getLogger(MyLogAspect.class);19

20 /**

21 * 只要用到了com.yuan.p2.annotation.springAop.MyLog这个注解的,就是目标类22 */

23 @Pointcut("@annotation(com.ssm.yuan.springaop.MyLog)")24 private voidMyValid() {25 }26

27 @Before("MyValid()")28 public voidbefore(JoinPoint joinPoint) {29 MethodSignature signature =(MethodSignature) joinPoint.getSignature();30 logger.debug("[" + signature.getName() + " : start.....]");31

32 MyLog myLog = signature.getMethod().getAnnotation(MyLog.class);33 logger.debug("【目标对象方法被调用时候产生的日志,记录到日志表中】:"+myLog.desc());34 }35 }

Controller层

1 packagecom.ssm.yuan.controller;2

3 importcom.ssm.yuan.springaop.MyLog;4 importorg.springframework.stereotype.Component;5

6 /**

7 */

8 @Component9 public classLogController {10

11 @MyLog(desc = "这是结合spring aop知识,讲解自定义注解应用的一个案例")12 public voidtestLogAspect(){13 System.out.println("随便写点东西。。。。");14 }15 }

SpringBaseTest

packagecom.ssm.yuan;importcom.ssm.yuan.model.Surfaceregistration;importcom.ssm.jt.util.PageBean;importorg.junit.Before;importorg.junit.runner.RunWith;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations={"classpath:spring.xml"})public classSpringBaseTest {

}

Controller层测试

1 packagecom.ssm.yuan.controller;2

3 importcom.ssm.yuan.SpringBaseTest;4 importorg.junit.Test;5 importorg.springframework.beans.factory.annotation.Autowired;6

7 /**

8 */

9 public class LogControllerTest extendsSpringBaseTest {10 @Autowired11 privateLogController logController;12

13 @Test14 public voidtestLogAspect(){15 logController.testLogAspect();16 }17 }

谢谢观看!!!

java自定义注解为空值_java自定义注解相关推荐

  1. java自定义注解为空值_java 自定义注解

    转载自(https://www.cnblogs.com/liangweiping/p/3837332.html) 目录 1.通过自定义注解,进行赋值 2.通过自定义注解,进行校验 3.实际应用如何应用 ...

  2. java注解获取参数_JAVA 自定义注解及参数获取 | 学步园

    package com.java.annotation; import java.lang.annotation.*; /** * Created by lw on 14-5-30. * 自定义注解 ...

  3. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  4. java注解定义常量_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  5. java中注解的使用_java中注解的使用

    使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节.注解就是用于修饰类.全局变量.方法.参数或局部变量的接口,java中规定,注解的使用 ...

  6. java 注解数组初始化_Java 之 注解的定义

    一.元注解 1.元注解概述 元注解:用于描述注解的注解 2.常用的元注解 (1)@Target:描述注解能够作用的位置 Target 里面是一个 ElementType[] value() 的枚举数组 ...

  7. @data注解的作用_Java中注解学习系列教程-2

    在上一篇文章中,我们讲解了:Java中注解的定义.JDK中内置注解.第三方注解. 本文是注解系列教程中的第二篇.来看看今天主要内容: ​ 1:注解的分类 2:元注解说明 3:自定义注解声明 一:注解的 ...

  8. java中list去除空值_Java –从列表中删除所有空值

    java中list去除空值 介绍: 在本文中,我们将学习如何使用普通的Java,Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 . 所以,让我们开始吧! 从Java中的 让我 ...

  9. java自定义封装一个方法_Java自定义套件封装教程

    Java自定义套件封装教程 时间:2017-07-28     来源:华清远见JAVA学院 各位亲爱的小伙伴们大家好,近很多伙伴都问我该怎么做Java自定义套件封装,今天华清Java学院小编在这里做了 ...

最新文章

  1. Ubuntu 彻底卸载 OpenCV
  2. Vmware下设置Ubuntu桥接上网
  3. np实现sigmoid_使用numpy实现一个深度学习框架
  4. 计算机视觉--优秀开源方案集锦
  5. linux程序莫名异常怎么查
  6. 模拟退火算法(代码可直接运行)
  7. Maven 入门 (1)—— 安装
  8. 中国电信天翼云进入4.0阶段,打造一朵无处不在的分布式云
  9. python 中del 的用法
  10. android rtc 不能写时间到 rtc 原因分析
  11. HTML5和CSS3系列(四):常见样式、背景、Web字体、2D转换、过渡
  12. C#获取登录验证码图片
  13. 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...
  14. CSS3弹性布局、响应式布局、PS
  15. 鸿蒙IPC摄像机,【HiSpark IPC DIY Camera试用连载 】第二篇 视频的人脸检测
  16. mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
  17. YML(YAML)语法(文件后缀为.yml格式)
  18. 2011年11月校园招聘JAVA面试题整理
  19. 【python】pandas库pd.to_excel操作写入excel文件参数整理与实例
  20. Zzzj Submit:WordPress 百度熊掌号/原创保护文章数据推送插件 V3.5

热门文章

  1. python 调用shell或windows命令
  2. 有3个集合, 从其中一个集合中删除同时存在于另外两个集合的元素
  3. 人工智能抢饭碗,你的工作还保得住吗?
  4. 初识压缩感知 compressive sensing
  5. CSDN博客如何转载(技术贴)
  6. c++ 图片验证码识别_基于tensorflow 实现端到端的OCR:二代身份证号识别
  7. a=a+b与a+=b有什么区别吗?
  8. 051_InfiniteScroll无限滚动
  9. 009_Spring Data JPA一对一关系
  10. 西文是指什么_儒家君子文化:何为君子?为什么要做君子,而不做小人?