Java注解
1、 概述:
a. 概念:提供对元数据的支持,可以在编译、加载和运行时被读取,并执行相应的处理.
b. 作用范围:用于修饰包、类、构造器、方法、成员变量、参数和局部变量的声明.
c. 使用形式:name = value形式
d. 特点:不会影响代码的执行.
2、 基本注解(Java提供的注解):
这三个注解都在java.lang包下.
* 分类:
* @Override:限定重写父类方法.
* 当前类必须具有一个或多个父类.
* 利用 @Override修饰的方法一定重写父类的方法.
* 使用场景:只能使用在方法上.
* @Deprecated:标示已过时.
* 原因:
* Java的版本更新时,向下兼容.(工程代码最初时使用Java 1.4, 更新为1.5依旧可以)
* 软件开发时,在新版本的软件代码中,不再不要曾经的一些方法时,使用该注解.
* 含义:当一个方法被标识为已过时,表示一定存在一个新方法替代.(依旧使用被标识过时的方法,也可以)
* 使用场景:用于方法、类等,一般在方法上使用.
* @SuppressWarnings:抑制编译器警告.
* 使用方式: @SuppressWarnings(value = { "b" })
* 自定义注解类:
* 通过观察Java底层提供的注解内容,注解的定义类似于接口的定义.
public @interface Override {
String[] values() default 默认值;
}
* 注解类使用的是 @interface,接口使用的是 interface.
* 注解类定义的必要属性,类似于接口中定义的方法.
* 自定义注解类:
* 是public修饰的.
* 使用 @interface 关键字
* 作用范围:用于类、方法、成员变量及局部变量等.
* 限制注解类的注解:
* @Target
* 作用:指定当前自定义注解类可以应用在哪里(注解使用的范围).
* 备选值:
* ElementType.TYPE:指定该策略的Annotation可以修饰类、接口或枚举定义.
* ElementType.PARAMETER:指定该策略的Annotation只能修饰参数.
* ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义.
* ElementType.METHOD:指定该策略的Annotation只能修饰方法定义.
* ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量.
* ElementType.FIELD:指定该策略的Annotation只能修饰成员变量.
* ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器.
* ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation.
* @Retention
* 作用:指定当前自定义注解类的生命周期.
* 备选值:
* RetentionPolicy.CLASS:当前注解内容只保留在Class文件中,JVM虚拟机不能获取注解内容.
* RetentionPolicy.RUNTIME:当前注解内容可以保留到运行,JVM虚拟机可以获取注解内容.
* RetentionPolicy.SOURCE:当前注解内容只保留在源码中,编译后失效.
* 生命周期由短到长:SOURCE -> CLASS -> RUNTIME
* @Documented
3、 反射读取注解:
* 注意:
* 利用反射读取的注解的生命周期,一定是RUNTIME.
* 反射与注解的父接口:
* 反射:AnnotatedElement接口,提供反射获取注解信息的方法.
* getAnnotation(Class<T> annotationClass)方法:获取指定注解信息.
* getAnnotations()方法:获取所有注解信息.
* isAnnotationPresent()方法:判断指定注解是否作用在当前元素(Class\Method\Field等)上
* 注解:Annotation接口
* 看具体注解作用在哪里(例如在方法上,使用Method的getAnnotation())
实例:自定义一个注解类,用于定义连接MySQL数据库使用的四个参数.
package app.java.anno.demo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** 自定义一个注解类,用于定义连接MySQL数据库使用的四个参数.* * driverClassName* * url* * username* * password*/@Target(ElementType.TYPE)@Retention(RetentionPolicy.SOURCE)public@interfaceJdbcinfo{String driverClassName()default"com.mysql.jdbc.Driver";String url();String username()default"root";String password();}
package app.java.anno.demo;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/*** 封装利用JDBC连接MySQL数据库的工具类.* @author JYL*/@Jdbcinfo(password ="root", url ="jdbc:mysql://localhost:3306/day0402")publicclassJDBCUtils{privatestaticJdbcinfo jdbcinfo =null;static{//利用反射读取对应注解信息Class<JDBCUtils> clazz1 =JDBCUtils.class;Class<Jdbcinfo> clazz2 =Jdbcinfo.class;Jdbcinfo jdbcinfo = clazz1.getAnnotation(clazz2);try{Class.forName(jdbcinfo.driverClassName());}catch(Exception e){e.printStackTrace();}}publicstaticConnection getConnection()throwsSQLException{returnDriverManager.getConnection(jdbcinfo.url(),jdbcinfo.username(),jdbcinfo.password());}publicstaticvoid close(Connection conn,Statement stmt){try{if(stmt !=null){stmt.close();}if(conn !=null){conn.close();}}catch(SQLException e){e.printStackTrace();}}publicstaticvoid close(Connection conn,Statement stmt,ResultSet rs){try{if(rs !=null){rs.close();}if(stmt !=null){stmt.close();}if(conn !=null){conn.close();}}catch(SQLException e){e.printStackTrace();}}}

浙公网安备 33010602011771号