1. 注解介绍
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
1. 注解本质分析
分析一下注解的本质:将其.class文件找到,反编译. 可以使用javap命令或反编译工具。
@interface MyAnnoation{}
反编译后的结果
interface MyAnnotation extends Annotation{}
结论:注解本质上就是一个接口。它扩展了java.lang.annotation.Annotation接口;
在java中所有注解都是Annotation接口的子接口
注解属性类型
1.基本类型 byte short int long float double char boolean
2.String
3.枚举类型
4.注解类型
5.Class类型
6.以上类型的一维数组类型
1. 自定义注解-元注解
什么是元注解及其作用
用于修饰注解的注解,可以描述注解在什么范围及在什么阶段使用等
- 四个元注解介绍
@Retention
指定注解信息在哪个阶段存在 Source Class Runtime
SOURCE它对应着编译阶段,可以帮助我们进行检查。
CLASS 它对应解析执行阶段
RUNTIME 它对应着在JVM中
@Target
指定注解修饰目标对象类型 TYPE 类、接口 FIELD 成员变量 METHOD 方法
@Documented
使用该元注解修饰,该注解的信息可以生成到javadoc 文档中
@Inherited
如果一个注解使用该元注解修饰,应用注解目标类的子类会自动继承该注解
@Retention @Target 是自定义注解必须使用两个元注解,并且,@Retention它的值应该是RUNTIME,因为我们会结合反射技术来使用。 @Target我们一般使用TYPE或METHOD
1. 案例-获取Connection连接数据库
目的:让注解具有功能,必须结合反射技术来应用。
注解它可以替换配置文件。
//第一步:创建注解
package com.itheima.ann;
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.TYPE,ElementType.METHOD})
public @interface MyAnnotation{
public abstract String driverClass();
public abstract String url();
public abstract String username();
public abstract String password();
}
//第二步:使用注解,我们可以通过getAnnotation()方法来获取注解对象
//第一种方案:
package com.itheima.ann;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class AnnotationTest {
@MyAnnotation(driverClass = "com.mysql.jdbc.Driver", password = "123456", url = "jdbc:mysql:///user", username = "root")
public static Connection getConnection() throws NoSuchMethodException, SecurityException, ClassNotFoundException, SQLException{
Class clazz=AnnotationTest.class;
Method method=clazz.getDeclaredMethod("getConnection");
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);//用方法获取
String driverClass = annotation.driverClass();
String url = annotation.url();
String username = annotation.username();
String password = annotation.password();
//加载驱动
Class.forName(driverClass);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, SQLException {
Connection connection = getConnection();
ResultSet resultSet = connection.createStatement().executeQuery("select * from student");
while (resultSet.next()) {
String id = resultSet.getString("id");
String name = resultSet.getString("name");
String age = resultSet.getString("age");
System.out.println(id+"--"+name+"--"+age);
}
}
}
//第二种方案:
package com.itheima.ann;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
@MyAnnotation(driverClass = "com.mysql.jdbc.Driver",password = "123456", url = "jdbc:mysql:///user", username = "root")
public class AnnotationTest2 {
@SuppressWarnings("unchecked")
public static Connection getConnection() throws Exception{
Class clazz=AnnotationTest2.class;
MyAnnotation annotation = (MyAnnotation)clazz.getAnnotation(MyAnnotation.class);//用类获取,需要强转
String driverClass = annotation.driverClass();
String url = annotation.url();
String username = annotation.username();
String password = annotation.password();
Class.forName(driverClass);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
public static void main(String[] args) throws Exception {
Connection connection = getConnection();
ResultSet resultSet = connection.createStatement().executeQuery("select * from student");
while (resultSet.next()) {
String id = resultSet.getString("id");
String name = resultSet.getString("name");
String age = resultSet.getString("age");
System.out.println(id+":"+name+":"+"age");
}
}
}