1.注解的优势
配置文件:有较好的扩展性和阅读性
注解:对类、方法、变量做标记(解释、处理),然后用反射去有选择的执行一些赋值、调用方法
2.注解的概述
1.注解就是标记解释用的
- jdk中常见的注解
@Override // 重写方法上面,验证重写格式是否正确
@Deprecated // 过期方法上
@SuppressWarnings(value = "all") 压制警告,让idea等工具的编译器不提示警告(类,和方法上)
@FunctionalInterface // 函数式接口上,验证是否只有一个抽象方法
3.自定义注解
public @interface 注解名{
public 属性类型 属性名 () default 默认值;
public int a () default 23;
}
- 属性类型
- 基本数据类型
- String
- Class
- 注解
- 枚举
- 以上数据类型的一维数组
4.自定义注解练习
通过注解 指定程序运行时 通过反射,执行@Test注解的方法
package com.itheima.annotation;
import com.itheima.thread.Demo;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Inherited
public @interface Test {
int age() default 23;
String name() default "zhangsan";
Class clazz() default Demo.class;
int[] scores() default {23,24,25};
}
---------------------------------------------------
package com.itheima.annotation;
public class AnnotationTest {
@Test
public void method1(){
System.out.println("method1");
}
public void method2(){
System.out.println("method2");
}
@Test
public void method3(){
System.out.println("method3");
}
}
------------------------------------------------
package com.itheima.annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class<?> clazz = Class.forName("com.itheima.annotation.AnnotationTest");
AnnotationTest annotationTest = (AnnotationTest) clazz.newInstance();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if(method.isAnnotationPresent(Test.class)){
method.invoke(annotationTest);
}
}
}
}
5.元注解
描述注解的注解,给注解做标记和解释
- @Target 指定当前注解能在哪里使用:类、成员变量、成员方法等等
- @Retention 指定当前注解的保留时间(生命周期)
- @Inherited 当前注解可以被子类继承
- @Document 当前注解会出现在API文档中
|