注释: java不会编译注释的内容,给程序员看的。
注解: 给程序看,当程序看到这个注解时,就会解析它。
譬如: @Controller @Override
注解的分类:
- 预定义注解
- 自定义注解
- 元注解
注解的定义:
可以看作是对一个类/方法的一个扩展的模版,每个类/方法按照注解类中的规则,来为类/方法注解不同的参数,在用到的地方可以得到不同的 类/方法中注解的各种参数与值。
注解也就是Annotation,注解不是一段辅助性的文字。
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
1.预定义注解预定义注解就是JDK自带的一些注解,该注解被JVM而解析。
- @Override: 重写得注解。符合重写得规则。
- @Deprecated: 表示已过时。
- @SuppressWarnings: 表示压制警告。
- @FunctionInterface: 表示函数式接口。表示该接口中有且仅有一个抽象方法。
1.限定父类重写方法:@Override
当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误
2.标示已过时:@Deprecated
这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出警告(删除线,这个见了不少了吧)。
3.抑制编译器警告:@SuppressWarnings
被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告,例如修饰一个类,那他的字段,方法都是显示警告
4.函数式接口与@Functionallnterface
什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)
接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final。
接口里面不能有私有的方法或变量。
这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口
2.元注解-
定义在注解上的注解称为元注解。
@Controller它只能加在类上 @Override它只能加在方法上。因为它使用了元注解可以设置注解使用的位置。
1. @Target(value=可以取下面这些内容): 作用限制注解使用得位置。
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE2. @Retention: 注解什么时候生效。默认时源码 java经历了那些阶段。
源码阶段-->字节码阶段--->运行阶段
SOURCE,
CLASS,
RUNTIME
3. @Documented 当生产API文档时该注解还存在。4. @Inherited 是否运行被子类继承。
例:
public class Test {
public static void main(String[] args) {
}
}
//表示该注解可以使用的位置
@Target(ElementType.TYPE)
//表示注解什么时候生效--source--class[默认字节码有效]---runtime[反射时验证,多用]
@Retention(RetentionPolicy.RUNTIME)
//是否在生成api文档时存在该注解
@Documented
//子类是否能继承该注解,如果注解在定义时使用了下面这个元注解则能被子类继承。
@Inherited
@interface My{
String value(); //如果设置default默认值,那么在使用该注解时可以不为该属性赋值。
int age() default 15;
String[] hobby() default {};//
}
//使用注解 如果使用注解时有且仅有一个属性没有赋值,而且该属性的名字value那么在给该属性赋值值,可以省略value
@My(value = "hello",hobby = "游泳")
class Info{
public String name;
public void show(){
System.out.println("show================="+name);
}
}
3.自定义注解
语法:
@interface 注解名{
数据类型 属性名() default 默认值;
}
数据类型: 基本类型,字符串类型,枚举类型【常量】,注解类型,数组类型[必须是上面这些类型的数组]
例:
@MyAnnotation(name = "",value = "")
public class Test {
//@MyAnnotation(name="11",value = "11")
public static void main(String[] args) {
}
}
//该注解只能在类上使用
@Target(ElementType.TYPE)
//在运行时有效。
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
String[] name() default "";//默认值为null
String value();
}
注意: 使用注解和不使用注解的区别
暑期编程PK赛 得CSDN机械键盘等精美礼品!注解本身没有任何意义,它只有被解析了,才会赋予真正的意义。
反射可以对对象注解进行解析。
像:@Override 它被JVM解析,从而使其具有相应的意义。
@Controller @RequestMapping 它被Spring框架解析,所以具有相应的意义。



