java 注解(Annotation)
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。
以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。
标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
一个注解相当于一个类。
看java.lang包,可看到JDK中提供的最基本的annotation。
@SuppressWarning(”deprecation”)--->压制警告
SupressWarning是告知编译器或开发工具等提示指定的编译器警告;
“deprecation”是告知具体的信息即方法已过时。
@Deprecated(过时的方法,对于不再使用的方法,可能别人或别的地方有调用这个方法,不能删除完事)
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。测试一下。
@SuppressWarnings("deprecation") (用这个可以告诉 程序说,我知道调用的方法过时了)
@Override--->提示覆盖(父类方法)
public boolean equals(Reflect other)方法与HashSet结合讲解
像person类,覆盖父类的equals 和hashCode方法,人家接收的参数是Object,人们习惯总是传入自己的对象,造成覆盖失败,变成重载!
注解的应用结构图
演示和讲解@Target元注解
Target(告诉编译器,自定义的注解类可以用在方法还是类....),设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。
(自定义注解)示例代码:
@Retention(RetentionPolicy.RUNTIME)//告诉程序说,这个注解要保存到运行时期
@Target({ElementType.METHOD,ElementType.TYPE})//告诉编译器,这个注解可以用在方法上,也可以用在类上
public @interface MyAnnotation {
String color() default "yellow";//默认缺省值为yellow
String value() ;//不指定
int [] arrayAttr() default {1,2};//默认为{1,2}
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚举类
MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");//属性中加注解,用@。可以在对别的类加注解时,改变值
}
为注解增加基本属性
(可以是八种基本数据类型,String ,数组,枚举,注解,Class)
什么是注解的属性?
一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是传智播客的学生,否则,就不是。如果还想区分出是传智播客哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。加了属性的标记效果为:@MyAnnotation(color="red")
定义基本类型的属性和应用属性:
在注解类中增加String color();
@MyAnnotation(color="red")
用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。
枚举和注解都是特殊的类,不能用new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。
在程序中如何创建出一个注解的实例对象啊?直接用@放上一个标记即可
Eg:package july78javaEnhance;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)//元注解:信息的信息就是元信息 RUNTIME,保留到运行期间
/**
* 指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,
* 则保留策略默认为 RetentionPolicy.CLASS。
*/
//@Target(ElementType.METHOD)如果加上这句的话(只能作用于方法),那边就会报错!
public @interface AnnotationDemo12 {//注解
String color() default "blue";//相当于构造方法一样,如果给了它默认的初值,可以不用再设置(有默认的)
String value();
int []age();//数组和枚举类型的注解
//还有注解类型的注解,暂时没学会
MetaAnnotation annotation();
//上面的MetaAnnotation是自己定义的一个注解类型,这样的话对于应用了当前注解的AnnotationDemo11类,就必须写上注解类型的属性
}
package july78javaEnhance;
import java.util.Arrays;
//备注:应用注解后,它的属性你你没有写上,它会给予提醒!missing attribution
@AnnotationDemo12(color = "red",value = "j2ee",age = {1,2,3}, annotation = @MetaAnnotation(sex = "男"))//注解加注解
public class AnnotationDemo11 {
@SuppressWarnings("deprecation")//压缩注解,一个注解就是一个类,用到的一个注解就相当于是调用的实例对象
@AnnotationDemo12(value = "jase",age = {1,2,3}, annotation = @MetaAnnotation(sex = "女"))//备注:如果别的属性有默认值,只有一个属性需要你设置,那么你就不需要写上全部的
//赋值表达式,如上直接写上"jase"就行
public static void main(String[] args) {
System.runFinalizersOnExit(true);//表示已经过时的方法,开发工具会给它中间加上一天横线
/**
* boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
*/
if(AnnotationDemo11.class.isAnnotationPresent(AnnotationDemo12.class)){
AnnotationDemo12 annocation = (AnnotationDemo12)AnnotationDemo11.class
.getAnnotation(AnnotationDemo12.class);//证明这里面有你的注解
System.out.println(annocation.color());//调用属性
System.out.println(Arrays.toString(annocation.age()));//将数组打印出来
System.out.println(annocation.annotation().sex());//相当于调用属性的属性
}
}
}
java 注解(Annotation)的更多相关文章
- Java - 注解 (Annotation)
Java - 注解 (Annotation) 一.基本的 Annotation > 使用 Annotation 时要在其前面增加 @符号,并把该 Annotation 当成一个修饰符 ...
- Java注解Annotation(一)
Java注解Annotation(一)——简介 这一章首先简单介绍一下注解,下一章会给出一个注解应用的DEMO. 1. 元注解 元注解的作用是负责注解其他的注解. JDK1.5中,定义了4个标准的me ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- Java注解Annotation与自定义注解详解
Java注解简介 开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的应用场景和如何自定义注解. 下面列举开发中常见的注解 @Override:用于标识 ...
- 深入JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- 深入学习JAVA注解-Annotation(学习过程)
JAVA注解-Annotation学习 本文目的:项目开发过程中遇到自定义注解,想要弄清楚其原理,但是自己的基础知识不足以支撑自己去探索此问题,所以先记录问题,然后补充基础知识,然后解决其问题.记录此 ...
- java注解(Annotation)解析
注解(Annotation)在java中应用非常广泛.它既能帮助我们在编码中减少错误,(比如最常见的Override注解),还可以帮助我们减少各种xml文件的配置,比如定义AOP切面用@AspectJ ...
- Java注解Annotation学习
学习注解Annotation的原理,这篇讲的不错:http://blog.csdn.net/lylwo317/article/details/52163304 先自定义一个运行时注解 @Target( ...
- java注解Annotation
扯扯注解的蛋 为什么学习注解?学习注解有什么好处?学完能做什么? 1.能够读懂别人的代码,特别是框架相关的代码 2.让编程更加简洁,代码更加清晰 3.让别人高看你一眼 注解是java1.5引入的 概念 ...
- java 注解Annotation
什么是注解? 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的. java注解又叫java标注,java提供了一套机制,使得我们可以对 ...
随机推荐
- 【机器学习PAI实战】—— 玩转人工智能之美食推荐
前言 在生活中,我们经常给朋友推荐一些自己喜欢的东西,也时常接受别人的推荐.怎么能保证推荐的电影或者美食就是朋友喜欢的呢?一般来说,你们两个人经常对同一个电影或者美食感兴趣,那么你喜欢的东西就很大程度 ...
- Spring新特性_泛型依赖注入
泛型依赖注入 package com.tanlei.spring.generic; import org.springframework.beans.factory.annotation.Autowi ...
- git day01笔记 常用操作命令 快照 推送 拉取
ansible 批量在远程主机上执行命令或者脚本 git 做版本控制的一个工具 ## git操作命令: 工作区:当前编辑的区域 缓存区:add 之后的区域 本地仓库:commit之后的区域 远程仓 ...
- Spring → 《Spring程序开发》教材大纲
- day39 09-Spring的AOP:基于AspectJ的通知类型
AspectJ的六种通知的类型,最后一种不讲,只讲前五种. 环绕通知是可以阻止目标方法执行的. <?xml version="1.0" encoding="UT ...
- photoshop正确的打开方式
首先这边我先贴一个地址:https://www.adobe.com/cn/products/photoshop.html 安装软件,这里就不赘述了,真的不会,可以百度^_^我当初就是百度的,哈哈 说到 ...
- 笔记:VSCODE 在 WSL 开发时不显示代码差异问题
笔记:VSCODE 在 WSL 开发时不显示代码差异问题 这个好像和 VSCODE 关系不大,主要是因为 WSL 里使用了软链接接,导致无法显示差异. 因为毕竟是软链接,所以在系统文件中会导致无法识别 ...
- 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
title author date CreateTime categories win10 uwp win2d 入门 看这一篇就够了 lindexi 2019-5-25 20:0:52 +0800 2 ...
- SDUT-2124_基于邻接矩阵的广度优先搜索遍历
数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个无向连通图 ...
- 关于使用JavaMail发送邮件抛出java.lang.NoSuchMethodError: com.sun.mail.util.TraceInputStream.<init>(Ljava异常的解决方法
我们在使用JavaMail时有可能会如下异常: Exception in thread "main" java.lang.NoSuchMethodError: com.sun.ma ...