注解
1.什么是注解
1.1注解入门
注解起源
annotation 从JDK5.0开始引入
注释和注解
comment 注释
- 不是程序本身,给人解释程序
annotation 注解
- 不是程序本身,可以对程序作出解释
- 可以被其他程序(编译器)读取,通过反射读取
注解的格式
@注释名 可以添加参数值
@SuppressWarnings(value="unchecked")
@Deprecated 已废弃的,可以写在不推荐使用的方法前
注解在哪里使用
可以添加在package,class,method,field等上面,相当于添加了额外的信息
通过反射机制进行编程来实现对这些元数据的访问
代码
public class Test01 extends Object{
//重写的注解
@Override
Public String toString{ //注解有检查的约束,如果上面的toString写的与父类不一致就会报错
return super.toString();
}
}
1.2内置注解
三个内置注解
以下三个注解定义在java.lang
下,例如@Override在java.lang.Override
以此类推。
- @Override - 检查该方法是否是重写方法,没有重写会报编译错误。只适用于修饰方法。
- @Deprecated - 标记过时方法,不鼓励程序员使用,因为危险或存在更好的选择。如果使用该方法,会报编译警告。可以用来修饰方法,属性,类。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。该注释需要添加参数。
- @SuppressWarnings("all")
- @SuppressWarnings("unchecked")
- @SuppressWarnings(value={"unchecked","deprecation"})
- ......
1.3元注解,自定义注解
元注解
meta-annotation 元注解:负责注解其他注解。可以在java.lang.annotation
包中找到下面4个类型和它们做支持的类。
- @Target - 描述注解的使用范围(注解可以用在什么地方)
- @Retention - 表示需要在什么样的级别保存该注解信息,描述注解的生命周期(SOURCE<CLASS<RUNTIME) 常用
- @Documented - 标记这些注解是否包含在用户文档中。
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) 子类可以继承父类的该注解
自定义注解
- 使用@interface来声明注解 格式public @interface 注解名
- 其中的每一个方法其实是声明了一个配置参数
- 方法的名称就是参数的名称
- 返回值的类型就是参数的类型 返回值只能是基本类型class,String,enum
- 可以通过default来声明默认的参数值
- 如果只有一个参数,一般参数名为value
- 注解元素必须要有值,我们定义注解时一般使用空字符串或0作为默认值
@ MyAnnotation
public class Test02{
public test(){
}
}
//定义注解
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation{
//仅使用元注解配置
}
代码
public class Test03 {
//注解可以显示赋值,如果没有默认值,就必须赋值
@MyAnnotation2(name = "李华")
public void test(){
}
// 只有一个参数且名为value时可以省略参数名
@MyAnnotation3("李华")
public void test2(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//这是注解的参数 格式:参数类型 + 参数名 + ();
String name() default "";
String[] schools() default {""};
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
//如果只有一个参数,建议使用value
String value();
}