[toc]
java-注解annotation
概述
JDK5之后出现,和类 接口同级。
格式:@interface 注解名{}
作用:
— 编译检查@overwrite
— 替代配置文件
— 定义注解(元注解:注解上的注解)
— 分析代码(用到反射)
java中的3个注解
@Override:声明该方法是从父类继承过来的,执行编译期的检查。
@Suppresswarnings:抑制警告
@Deprecated:声明该方法不赞成使用
自定义注解
定义
1 2 3 4 5 6 7 8
| public @interface MyAnno1{ }
@MyAnno1 public test01(){ }
|
注解属性
@MyAnno1(“123”)
注解的本质是接口,继承Annotation,接口中可以有常量和抽象方法
抽象方法在注解中称为 注解属性
注解属性类型:
1 2 3 4 5 6
| 基本类型 String Class Annotation Enum:枚举 以上类型对应的一位数组
|
注解如果有属性,使用时必须赋值(除非这个属性有默认值)
定义默认值 :String name() default “machine”;
赋值:
@注解名(属性名1=属性值1,属性名2=属性值2)
若注解类型为数组,且只有一个值的时候,有两种写法
1 2 3 4
| 方式1: @MyAnno(属性名={值1,值2,值3}) 方式2: @MyAnno(属性名=值)
|
当属性名为value,且只需为这个属性赋值,value属性名可以省略
元注解
元注解是定义在注解上的注解,有4个元注解
1 2 3 4 5 6 7 8 9 10
| @Retention 规定注解保留到什么阶段(生命周期) SOURCE(默认):只在代码中保留,在字节码文件中就删除了(像@Override一样,只在编译阶段检查异常) CLASS:在代码和字节码文件中保留 RUNTIME:所有阶段都保留(代替配置文件时) 使用:@Retention(RetentionPolicy.RUNTIME) @Target 规定注解作用在什么上面 TYPE:作用在类 接口 等 上面 METHOD:作用在方法上面 FIELD:作用在字段上面 使用:@Target(ElementType.METHOD)
|
获取属性值(反射)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.itheima.a_annotation.plus;
import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager;
public class JdbcUtils { @JdbcInfo(url = "jdbc:mysql://localhost:3306/day16",password="1234") public static Connection getConnection() throws Exception{ //1.获取字节码文件 Class clazz=JdbcUtils.class; //2.获取getConnenction Method m = clazz.getMethod("getConnection"); //3.判断该方法上是否有 jdbcinfo注解 若有的话获取 if(m.isAnnotationPresent(JdbcInfo.class)){ JdbcInfo info = m.getAnnotation(JdbcInfo.class); //4.获取注解四个属性 String driverClass = info.driverClass(); String url = info.url(); String user = info.user(); String password = info.password(); //5.注册驱动 Class.forName(driverClass); //6.获取连接 return DriverManager.getConnection(url, user, password); } return null; } public static void main(String[] args) throws Exception { System.out.println(getConnection());; } }
|