1.注解的概述:
- 从JDK5.0开始,Java增加了对元数据(描述数据的数据称之为元数据)的支持,也就是Annotation(注释)
- Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
- Annotation和类 接口同级
2.注解的格式:
@interface 注解名{}
3.注解的作用:
- 编译检查@override的那种
- 替代配置文件
- 定义注解(元注解:注解上的注解)
- 分析代码(用到反射)
4. java中3个注解(理解)
@Override:声明该方法是从分类上继承过来的,执行编译期的检查
@SuppressWarnings:抑制警告 值有好多,只需要知道一个 all 抑制所有的警告
@Deprecated:用来声明 该方法不赞成使用(要么过时要么有bug) 编译器会给把代码中间写个横线用来提示不赞成使用
5.自定义注解
注解属性:
注解本质就是一个接口,接口中可以有常量和抽象方法
抽象方法在注解中就称之为注解属性注解属性类型:
基本类型
String
Class
Annotation
Enum:枚举
以上类型对应的一维数组注意:
一旦注解有属性了,使用注解的时候必须赋值,(除非这个注解属性有默认值)赋值的格式:
@注解名(属性名=属性值)
若注解类型为数组,且只有一个值的时候,可以有两种写法
方式1:
属性名 = { 值 }
方式2:
属性名=属性值
若属性名为value的时候,且只需要为这个value属性赋值的时候,value可以省略
6.元注解:
定义在注解上的注解
@Retention 规定注解保留到什么阶段 值为RetentionPolicy的三个枚举值
SOURCE:只在代码中保留,在字节码文件中就删除了
CLASS:在代码和字节码文件中保留
RUNTIME:所有阶段都保留
@Target 规定注解作用在什么上面 值为ElementType的枚举值
TYPE:作用在类 接口 等上面
METHOD:作用方法上面
FIELD:作用字段上面加上的注解默认是在源码阶段有,想要在runtime时候有加上 RUNTIME:
7.案例实现-模拟Junit测试
通过反射思想来获取字节码对象
然后通过字节码对象获取全部的方法
然后再获取带有注解的方法
最后m.invoke就可以执行了
package com.itheima.a_annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MainTest {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
//运行这个类的时候 需要将 测试类中带有@mytest所有方法执行
//获取字节码对象★★★
Class clazz=MyTestTest.class;
//获取所有的方法
Method[] arr = clazz.getMethods();
//让带有注解的方法执行
for (Method m : arr) {
//获取有注解的方法
//判断方法是否有指定的注解
boolean flag=m.isAnnotationPresent(MyTest.class);
if(flag){
//System.out.println(m.getName());
m.invoke(clazz.newInstance());//★★★
}
}
}
}
8.案例实现获得连接:(替代配置文件)
通过注解来获取配置文件1.自定义一个注解JDBCInfo
添加元注解:
在程序运行的时候使用 @Retention
只能作用在方法上 @Target
添加注解属性
String driverClass() default "com.mysql.jdbc.Driver";
String url();
String username() default "root";
String password();
2.在jdbcutils工具类中提供一个getConnection,在方法上面添加一个注解 @JDBCInfo(...)
getConnection方法需要进行的操作:获取注解上的四个属性值
获取字节码文件
获取该方法上的注解
获取注解的值
3.运行的时候可以通过getConnection获取一个连接
代码实现:
step1;定义一个info注解
package com.javaweb.annotationPlus; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)//★★★ @Target(ElementType.METHOD)//★★ public @interface JdbcInfo { String driverClass() default "com.mysql.jdbc.Driver"; String url(); String user() default "root"; String password() default "root"; }
step2定义一个类叫做jdbcutils
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");