注解

本文围绕Java注解展开,介绍注解是JDK1.5引入的代码级说明,本质是扩展了Annotation接口的接口。阐述了注解属性类型,还介绍了元注解,如@Retention、@Target等及其作用。指出自定义注解需结合反射技术,且注解可替换配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 自定义注解-元注解

什么是元注解及其作用

用于修饰注解的注解,可以描述注解在什么范围及在什么阶段使用等

  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");
           }
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值