注解和注释的区别:
注释:给程序员看的;
注解:给虚拟机看的,让虚拟机看到程序中的注解,注解代表程序的一些特殊功能。
jdk中提供的注解:
@Override 描述子类重写父类的方法
jdk1.5版本的时候,该注解只能应用在类的继承上。
jdk1.6版本的时候,该注解可以应用在类的实现上。
@SuppressWarnings() 用来压制警告
eg: @SuppressWarnings("all") 压制所有警告
@Deprecated 描述方法过时
自定义注解:(结合反射才会有意义)
定义类 class
定义接口 interface
定义枚举 enum
定义注解 @interface
定义注解的属性:
注解的属性的类型:
基本数据类型,字符串类型,Class类型,注解,枚举,以及以上类型的一维数组
注解的属性定义语法:
在变量后加括号;
eg: int a();
注解的属性默认初始值设置:
使用default 关键字;
eg: boolean b() default true;
注意:当你所定义的属性只有一个时且该属性名为value那么在使用该注解时可以直接写数值,不用写属性名;
当你所定义的属性有多个,但是除去名为value的属性,其他属性具有default值,那么在使用该注解时亦可以直接写数值不用写属性名;
eg: //定义注解
@interface Annos{ String value();}
//使用注解
@Annos("zhangsan")
public class demo{ }
eg:
package annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Anno @MyAnno(s="abc",c=String.class,an=@Anno,co=Color.RED,arr= {"abc","bca","cba"}) public class MyAnnoDemo { } //定义一个无属性的注解 @Retention(RetentionPolicy.RUNTIME) //元注解 @interface Anno{ } enum Color{ RED,BLUE,BLACK,YELLO; } //定义一个带有属性的注解 @Retention(RetentionPolicy.RUNTIME) //元注解 @interface MyAnno{ boolean b() default false; //定义基本数据类型的属性 String s(); //定义字符串数据类型的属性 Class c(); //定义Class类型的属性 Anno an(); //定义注解类型的属性 Color co(); //定义Color枚举的属性 String[] arr(); //定义一个String一维数组的属性 }
注解存在的阶段:
源码阶段(默认)
编译阶段
运行阶段
元注解:只用于修饰其他注解。
自定义注解默认存在于源码阶段,需要让注解存在的时间更长,使用元注解。
@Retention(RetentionPolicy.SOURCE);//被修饰的注解保存于源码阶段
@Retention(RetentionPolicy.CLASS);//被修饰的注解保存于编译阶段
@Retention(RetentionPolicy.RUNTIME);//被修饰的注解保存于运行阶段
注意:RetentionPolicy是enum枚举类型。
注解配合反射实现指定的功能:
1.编写注解
2.编写自定义类
3.编写核心运行类
eg:
public class CoreRunner { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { Class clazz = Demo.class; Method[] methods = clazz.getMethods(); for (Method method : methods) { // isAnnotationPresent() 判断该method对象上面是否被指定的注解修饰 if (method.isAnnotationPresent(Anno.class)) { method.invoke(clazz.newInstance(), null); } } } }