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注解的自定义和使用的更多相关文章

  1. [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

    转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...

  2. java 利用反射完成自定义注解

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

  3. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

  4. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  5. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  6. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  7. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  8. Java之注解

    package com.demo.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementTy ...

  9. Java核心 --- 注解

    Java核心——注解 注解是jdk5以后的新特性,Spring和Hibernate等框架提供了注解的配置方式使用, 本文参考了浪曦风中叶的注解讲解,主要讲解jdk内置注解的用法,注解的声明和定义,以及 ...

  10. java基础-注解Annotation原理和用法

    在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...

随机推荐

  1. 基于h5+的微信登录,hbuilder打包

    1.打开app项目的manifest.json的文件,选择模块权限配置,将OAuth(登录鉴权)模块添加至已选模块中 2.选择SDK配置,在plus.oauuth·登录鉴权中,勾选□ 微信登录,配置好 ...

  2. 结构型模式(三) 装饰模式(Decorator)

    一.动机(Motivate) 在房子装修的过程中,各种功能可以相互组合,来增加房子的功用.类似的,如果我们在软件系统中,要给某个类型或者对象增加功能,如果使用"继承"的方案来写代码 ...

  3. 业需软需word小技巧

    首先要看看word格式模板设计规则 一.页面材料格式模板  1. 页边距:上下边距为2.54cm:左右边距为2.8cm 2. 页眉.页脚:页眉为1.5cm:页脚为1.75cm 3. 行间距:20p行距 ...

  4. Spring框架的核心功能之AOP技术

     技术分析之Spring框架的核心功能之AOP技术 AOP的概述        1. 什么是AOP的技术?        * 在软件业,AOP为Aspect Oriented Programming的 ...

  5. jedis:分片集群使用

    jedis使用 引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis ...

  6. LeetCode 321. Create Maximum Number

    原题链接在这里:https://leetcode.com/problems/create-maximum-number/description/ 题目: Given two arrays of len ...

  7. 【DP入门到入土】

    DP例题较多,可以根据自己需求食用~ update:下翻有状压DP入门讲解,也只有讲解了(逃~ DP的实质,就是状态的枚举. 一般用DP解决的问题,都是求计数或最优问题,所以这类问题,我们也可以用搜索 ...

  8. Jenkins 通过 maven 构建编译 JAVA 项目环境

    Jenkins 通过maven 构建编译 JAVA 项目环境 官网下载合适Jenkins版本包: 1.jenkins http://mirrors.jenkins.io/war-stable/ 2.J ...

  9. leetcode解题报告(29):Student Attendance Record I

    描述 You are given a string representing an attendance record for a student. The record only contains ...

  10. 贪心算法训练(九)——Best Cow Line(字典序最小问题)

    原题链接:Best Cow Line 1. 问题描述 2. 输入 6 A C D B C B 3. 输出 ABCBCD 4.思路分析 不断地取原字符串 S 中开头和末尾比较小的字符串放到 T 的末尾 ...