注解的概述和分类
* 注解的概念:
* Java提供了一种和源程序中的元素关联的任何信息和任何元数据的方法和渠道
* 源程序: Java文件
* 元素: 构造方法/成员方法/成员变量/访问权限修饰符/注解...
* 任何信息: 就类似于Java中的注释,起到对元素的解释说明
* 任何元数据: 学完了元注解之后再来讲解
*
* 注解可以理解为一种使用相关信息来绑定Java文件元素的方式
*
* Java中常见的注解
* @Override: 表示必须对方法重写
* @Deprecated : 表示方法过时
* @SuppresWarning : 表示忽略警告
* @FunctionalInterface : 表示函数式接口
* 函数式接口: 如果一个接口只有一个抽象方法,那么该接口就是函数式接口,此接口再使用的时候可以使用Lambda表达式改进
*
* 注解的分类
* 按照运行机制分类:
* 源码注解: 注解只在源码中存在,当编译生成.class文件的时候,就不存在了
* 编译时注解: 注解在源码和.class文件中存在,当程序运行的时候它就不存在了
* 运行时注解: 在运行的时候还能够起作用的注解,它会动态影响到程序执行逻辑
* 元注解: 对注解进行注解
* 按照来源分类
* JDK自带的注解
* 第三方注解:后面框架中会学习到
* 自定义注解: @Column
* 元注解
*/
public class AnnotationDemo01 {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Date date = new Date();
date.setMinutes(100);
}
}
class Father{
public void show() {
System.out.println("111");
}
}
class Son extends Father{
// @Override
private String name;
// public void show(String name) {
// System.out.println("2222");
// }
// @Override
// public void show(String name) {
// // TODO Auto-generated method stub
// super.show();
// }
}
注解的语法
* 1.使用@interface关键字来定义注解
* 2.成员是以没有参数和没有异常的方式声明
* 3.可以使用default为成员指定一个默认值
* 4.注解的成员类型可以是哪些?
* Invalid type ArrayList
* only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
* 基本类型,Class,注解,枚举,一维数组
* 5.如果注解只有一个成员,则成员的命名必须叫做value,再使用这个注解的时候可以不写等于号
* 6.没有任何成员的注解叫做标识注解,它本身的存在与否就是一种意义,就类似于注释
*
*/
public class AnnotationDemo02 {
}
@interface MyAnnotation{
String name() default "zhangsan";
int age() default 18;
// String address() throws Exception;
// ArrayList
Class c();
Override override();
ElementType eType();
String[] list();
}
interface Inter{
String address() throws Exception;
}
@interface MyAnno{
// String id();
String value();
}
元注解
@Target:标识它所标识的注解能够作用在什么元素上
* 如果一个注解的@Target上面的注解范围显示了ANNOTATION_TYPE,那么表示该注解是元注解
* @Retention: 表示它所标识的注解的生命周期
* RetentionPolicy.SOURCE:表示该注解只在源码中存在
* RetentionPolicy.CLASS: 表示该注解只在源码和编译时存在
* RetentionPolicy.RUNTIME: 表示该注解在源码和编译时以及运行时存在
* @Inherited: 表示该注解可以被继承
* @Document: 表示该注解可以在生成API文档的时候显示在文档上
注解的使用
* 普遍的格式
* @注解名称(成员变量名称1 = 成员变量的值1, 成员变量名称2 = 成员变量的值2,...)
*
* 如果注解的成员只有一个,那么可以省略等于号
* 格式:
* @注解名称(成员的值)
* 如果注解是一个一维数组
* 格式:
* @注解名称({成员变量值1,成员变量值2,...})
*/
public class AnnotationDemo03 {
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE,ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Documented
@interface MyAn{
String name();
int age();
double weight();
}
@MyAn(name = "张三", age = 18, weight = 20.5)
interface Inter2{
}
@MyAn(name = "张三", age = 18, weight = 20.5)
class Student{
@MyAn(name = "张三", age = 18, weight = 20.5)
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@MyAn(name = "张三", age = 18, weight = 20.5)
public void setAge(int age) {
this.age = age;
}
}
@Documented
public @interface TestDocumented {
String name();
}