【JAVA】java注解的自定义和使用
java注解概念
Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法
java注解介绍
常用注解
@Override:表示方法是重写的方法
@Deprecated:过时的方法
@SuppressWarnings:抑制警告
注解分类
按照运行机制分
1、源码注解:注解只在源码中存在,编译成.class文件就不存在了
2、编译时注解:注解在源码和.class文件中都存在,如@Override
3、运行时注解:在运行阶段起作用,甚至会影响运行逻辑,如@Autowired
按照来源分
1、JDK自带注解
2、第三方注解
3、自定义注解
自定义注解和使用
1、使用@interface关键定义注解(Description.java),如下:
package com.hd; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 注解的注解:元注解
*
* 注解作用域
ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
ElementType.FIELD:允许作用在属性字段上
ElementType.METHOD:允许作用在方法上
ElementType.PARAMETER:允许作用在方法参数上
ElementType.CONSTRUCTOR:允许作用在构造器上
ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
ElementType.ANNOTATION_TYPE:允许作用在注解上
ElementType.PACKAGE:允许作用在包上 注解的生命周期
RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
RetentionPolicy.RUNTIME:永久保存,可以反射获取
*
*/
// 注解的作用域
@Target({ElementType.METHOD, ElementType.TYPE})
// 注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
// 允许子类继承
@Inherited
// 生成javadoc的时候生成注解的信息
@Documented
// @interface:使用@interface关键定义注解
public @interface Description { // 注解的成员
// 成员类型所限的,合法的类型包括原始数据类型及String、Class、Annotation、Enumeration
String desc(); String author(); // 成员以无参无异常方式生命,可以用default为成员指定一个默认值
int age() default 18; // 如果注解成员只有一个时,成员名必须取名未value(),在使用时可以忽略成员名和赋值号(=)
// 注解可以没有成员,没有成员的注解成为标识注解
}
2、在普通类上使用注解,使用方法
注解使用: @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)
如下:
package com.hd; /**
* 注解使用:
* @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)
* @author H__D
* @date 2019-07-09 22:49:32
*
*/
@Description(desc="I am class annotation", author="hd")
public class TestDescription { @Description(desc="I am method annotation", author="hd")
public String test(){ return "red";
} }
3、解析注解,通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
package com.hd; import java.lang.annotation.Annotation;
import java.lang.reflect.Method; /**
* 解析注解
* 通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
*
* 对于一个类或者接口来说,Class 类中提供了以下一些方法用于反射注解。
getAnnotation:返回指定的注解
isAnnotationPresent:判定当前元素是否被指定注解修饰
getAnnotations:返回所有的注解
getDeclaredAnnotation:返回本元素的指定注解
getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的
*
* @author H__D
* @date 2019-07-09 22:52:42
*
*/
public class ParseDecription { public static void main(String[] args) {
// TODO Auto-generated method stub
// 1、使用类加载器加载类
try {
Class c = Class.forName("com.hd.TestDescription");
System.out.println(c); // 2、找到类上面的注解
boolean isExist = c.isAnnotationPresent(Description.class); if(isExist) {
// 3、拿到注解实例
Description d = (Description) c.getAnnotation(Description.class);
System.out.println("========parse class annotation=========");
System.out.println("desc = " + d.desc());
System.out.println("author = " + d.author());
System.out.println("age = " + d.age());
} // 4、找到方法上的注解
Method[] ms = c.getMethods();
for (Method m : ms) {
boolean isMExist = m.isAnnotationPresent(Description.class);
if(isMExist) {
Description d = m.getAnnotation(Description.class);
System.out.println("========parse method annotation=========");
System.out.println("desc = " + d.desc());
System.out.println("author = " + d.author());
System.out.println("age = " + d.age());
}
} // 另外一种解析方法
for (Method m : ms) {
Annotation[] annotations = m.getAnnotations();
for (Annotation annotation : annotations) {
if(annotation instanceof Description) {
System.out.println("========parse method annotation other way=========");
Description d = (Description) annotation;
System.out.println("desc = " + d.desc());
System.out.println("author = " + d.author());
System.out.println("age = " + d.age());
}
}
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4、运行结果如下:
【JAVA】java注解的自定义和使用的更多相关文章
- [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门
转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...
- java 利用反射完成自定义注解
元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: 1.@ ...
- Java注解-元数据、注解分类、内置注解和自定义注解|乐字节
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...
- Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- 深入理解Java:注解
注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- Java之注解
package com.demo.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementTy ...
- Java核心 --- 注解
Java核心——注解 注解是jdk5以后的新特性,Spring和Hibernate等框架提供了注解的配置方式使用, 本文参考了浪曦风中叶的注解讲解,主要讲解jdk内置注解的用法,注解的声明和定义,以及 ...
- java基础-注解Annotation原理和用法
在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...
随机推荐
- test20190504 行走
行走(walk.cpp/c/pas) 题目描述 "我有个愿望,我希望走到你身边." 这是个奇异的世界,世界上的 n-1 条路联结起来形成一棵树,每条路有一个对应的权值 ci. 现在 ...
- stm32的hal之串口库函数总结复习
1.串口的使用方法 在hal库中,有三个串口发送的函数 a.HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uin ...
- The 2018 ACM-ICPC CCPC 宁夏 A-Maximum Element In A Stack
题意 对一个栈有入栈和出栈两种操作,求每次操作后栈的最大值的异或. 题目链接 分析 类似于单调栈,但是还没有那么复杂. 只需保持栈顶为最大值,如果入栈元素小于栈顶元素,则重复一次栈顶元素入栈:否则,直 ...
- C#格式化字符串使用
1 前言 如果你熟悉Microsoft Foundation Classes(MFC)的CString,Windows Template Library(WTL)的CString或者Standard ...
- 语法速学,返回数组 repeated修饰符
重新编写proto文件 syntax = "proto3"; package services; import "google/api/annotations.proto ...
- MongoDB collection Index DB 大小查询
1.collection中的数据大小 db.collection.dataSize() 2.为collection分配的空间大小,包括未使用的空间db.collection.storageSize() ...
- 汇编语言笔记 CALL和RET指令
转载地址:http://www.cnblogs.com/dennisOne ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程 ...
- h5页面滑动卡顿解决方法
解决方式: 给滚动的元素加样式:-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling(允许独立的滚动区域和触摸回弹) 如果值为au ...
- Js验证正则表达式
//验证是否手机 var base = Objcet();base.isPhone = function(num) { var preg = /^1[3-7,8]{1}[0-9]{9}$/; retu ...
- apt-get 和dpkg命令
软件包下载:apt-get 1.apt-get install vim 下载vim 2.apt-get upgrade vim 升级vim 3.apt-get update 列出更新 debian软 ...