注解至关于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。java
之后,javac编译器,开发工具和其余程序能够用反射来了解你的类及各类元素上有无何种标记,看你有什么标记,就去干相应的事。数组
标记能够加在包,类,字段,方法,方法的参数以及局部变量上。ide
一个注解至关于一个类。工具
看java.lang包,可看到JDK中提供的最基本的annotation。开发工具
@SuppressWarning(”deprecation”)--->压制警告测试
SupressWarning是告知编译器或开发工具等提示指定的编译器警告;spa
“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());//至关于调用属性的属性
}
}
}