java自定义注解为空值_java自定义注解
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自定义注解相关推荐
- java自定义注解为空值_java 自定义注解
转载自(https://www.cnblogs.com/liangweiping/p/3837332.html) 目录 1.通过自定义注解,进行赋值 2.通过自定义注解,进行校验 3.实际应用如何应用 ...
- java注解获取参数_JAVA 自定义注解及参数获取 | 学步园
package com.java.annotation; import java.lang.annotation.*; /** * Created by lw on 14-5-30. * 自定义注解 ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- java注解定义常量_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- java中注解的使用_java中注解的使用
使用过ssh框架的人一定也使用过注解,尤其是在spring框架中,注解可谓是spring容器和AOP编程的重要环节.注解就是用于修饰类.全局变量.方法.参数或局部变量的接口,java中规定,注解的使用 ...
- java 注解数组初始化_Java 之 注解的定义
一.元注解 1.元注解概述 元注解:用于描述注解的注解 2.常用的元注解 (1)@Target:描述注解能够作用的位置 Target 里面是一个 ElementType[] value() 的枚举数组 ...
- @data注解的作用_Java中注解学习系列教程-2
在上一篇文章中,我们讲解了:Java中注解的定义.JDK中内置注解.第三方注解. 本文是注解系列教程中的第二篇.来看看今天主要内容: 1:注解的分类 2:元注解说明 3:自定义注解声明 一:注解的 ...
- java中list去除空值_Java –从列表中删除所有空值
java中list去除空值 介绍: 在本文中,我们将学习如何使用普通的Java,Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 . 所以,让我们开始吧! 从Java中的 让我 ...
- java自定义封装一个方法_Java自定义套件封装教程
Java自定义套件封装教程 时间:2017-07-28 来源:华清远见JAVA学院 各位亲爱的小伙伴们大家好,近很多伙伴都问我该怎么做Java自定义套件封装,今天华清Java学院小编在这里做了 ...
最新文章
- Ubuntu 彻底卸载 OpenCV
- Vmware下设置Ubuntu桥接上网
- np实现sigmoid_使用numpy实现一个深度学习框架
- 计算机视觉--优秀开源方案集锦
- linux程序莫名异常怎么查
- 模拟退火算法(代码可直接运行)
- Maven 入门 (1)—— 安装
- 中国电信天翼云进入4.0阶段,打造一朵无处不在的分布式云
- python 中del 的用法
- android rtc 不能写时间到 rtc 原因分析
- HTML5和CSS3系列(四):常见样式、背景、Web字体、2D转换、过渡
- C#获取登录验证码图片
- 锁定计算机屏幕的快捷键是什么,锁住电脑屏幕的快捷键_打开电脑屏幕的快捷键...
- CSS3弹性布局、响应式布局、PS
- 鸿蒙IPC摄像机,【HiSpark IPC DIY Camera试用连载 】第二篇 视频的人脸检测
- mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
- YML(YAML)语法(文件后缀为.yml格式)
- 2011年11月校园招聘JAVA面试题整理
- 【python】pandas库pd.to_excel操作写入excel文件参数整理与实例
- Zzzj Submit:WordPress 百度熊掌号/原创保护文章数据推送插件 V3.5
热门文章
- python 调用shell或windows命令
- 有3个集合, 从其中一个集合中删除同时存在于另外两个集合的元素
- 人工智能抢饭碗,你的工作还保得住吗?
- 初识压缩感知 compressive sensing
- CSDN博客如何转载(技术贴)
- c++ 图片验证码识别_基于tensorflow 实现端到端的OCR:二代身份证号识别
- a=a+b与a+=b有什么区别吗?
- 051_InfiniteScroll无限滚动
- 009_Spring Data JPA一对一关系
- 西文是指什么_儒家君子文化:何为君子?为什么要做君子,而不做小人?