看视频跟着写点笔记
注解
jdk1.5后的特性,主要运用在框架中,替换繁琐的配置文件
-
JDK中预定义的一些注解
- @Override: 检测被该注解标注的方法是否继承父类(接口)
- @Deprecated:该注解标注的内容表示已过时
- @SuppressWarnings:压制警告
- 一般传递参数all @SuppressWarnings("all)表示压制所有警告
@SuppressWarnings("all") //压制所有警告 public class AnnotationDemo { @Override public String toString() { return super.toString(); } @Deprecated //设置test方法已过时 public void test() {} public void test2(){ } }
-
自定义注解
-
格式
元注解
public @interface 注解名称{
属性列表
}
-
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
- 通过反编译可以看到源代码
-
进行反编译:
-
属性:接口中的抽象方法
-
要求:
-
属性的返回值类型有下列取值
-
基本数据类型
-
String
-
枚举
-
注解
-
以上类型的数组
public @interface MyAnnotation { int method1(); String method2(); EnumDemo method3(); MyAnnotation2 method4(); int[] method5(); }
-
-
定义了属性,使用注解时必须给属性赋值
- 如果定义属性时,使用default关键字给属性设置默认初始化值,则使用注解时可以不用赋值
- 如果只有一个属性需要赋值,并且属性的名称是value时,则value可以省略,直接定义值即可.
- 数组赋值时,值使用{}包裹.如果数组中只有一个值,则{}可以省略
-
-
-
元注解:用于描述注解的注解
-
@Target: 描述注解能够作用的位置
- ElementType取值:
- TYPE:可以作用在类上
- METHOD: 可以作用于方法上
- FIELD:可以作用于成员变量上
- ElementType取值:
-
@Retention: 描述注解被保留的阶段
- @Retention(RetentionPolicy.RUNTIME) : 当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
-
@Documented: 描述注解是否被抽取到api文档中
-
@Inherited:描述注解是否被子类继承
-
-
在程序中使用注解:获取注解定义的属性值
- 获取注解定义的位置的对象 (Class, Method,Field)
- 获取指定的注解
- getAnnotation(Class)
-
调用注解中的抽象方法获取配置的属性值
@MyAnnotation2(className = "com.pretext.reflect.Person", methodName = "eat") public class AnnoTest { public static void main(String[] args) throws Exception{ Class<AnnoTest> clazz = AnnoTest.class; MyAnnotation2 annotation = clazz.getAnnotation(MyAnnotation2.class); /* 实际上相当于在内存中生成了一个类实现了该注解的类 public MyAnnotation2Impl implements MyAnnotation2 { public String className(){ return "com.pretext.annotation.MyAnnotation2; } */ System.out.println(annotation.className()); System.out.println(annotation.methodName()); Class<?> aClass = Class.forName(annotation.className()); Person person = (Person) aClass.newInstance(); Method method = aClass.getMethod(annotation.methodName()); method.invoke(person); } }
查看spring框架中的注解,加深理解
RequestMapping注解
@Target({ElementType.METHOD, ElementType.TYPE}) //元注解可已在方法,类中添加
@Retention(RetentionPolicy.RUNTIME) //表示保留到class上,并在JVM中加载
@Documented //提取文档时保留注解
@Mapping //没发现作用,里面只有元注解的出现
public @interface RequestMapping { //属性都设置的默认值,因此单独写path时没有写属性名
String name() default "";
@AliasFor("path") //为注解取别名,与下面的value相对应,防止同时出现程序发生异常
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}