Java 注解(Annotation)--基础篇

news/2024/5/19 3:31:05 标签: java, 反射, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

目录

1.Annotation的定义

2.Annotation作用分类

3.Annotation的语法形式

4.Annotation的分类

4.1:6个基本注解

4.2:4个元注解

4.2.1:@Target

4.2.2:@Retention    

4.2.3:@Documented(了解)

4.2.4:@Inherited(了解)

 5.Annotation的属性

   5.1简单演示


1.Annotation的定义

注解(Annotation),也叫元数据,是一种代码级别的说明。

它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

其实Annotation就是代码里的特殊标记,它们可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。


2.Annotation作用分类

  1. 编写文档:通过注解生成API文档(@Documented)
  2. 编译检查:通过注解让编译器实现基本的编译检查(@Override)
  3. 代码分析:通过注解对代码进行分析【class="tags" href="/tags/FanShe.html" title=反射>反射等】(重点)

3.Annotation的语法形式

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public @interface 注解名称 {}

      我们可以定义一个简单的注解,如下:

class="language-class="tags" href="/tags/JAVA.html" title=java>java">package com.hanyxx.annotaion;

/**
 * @author 菠菜饭团
 * @description: 自定义注解
 */
public @interface bocai {
}

class="language-html">如果通过 class="tags" href="/tags/JAVA.html" title=java>javac命令将注解类编译,然后再通过 class="tags" href="/tags/JAVA.html" title=java>javap 命令进行反编译,就会发现:
public interface com.hanyxx.annotaion.bocai extends class="tags" href="/tags/JAVA.html" title=java>java.lang.annotation.Annotation {}

注解的本质就是接口


4.Annotation的分类

class="tags" href="/tags/JAVA.html" title=java>java内置了6个基本注解和4个元注解

4.1:6个基本注解

class="language-html">@Override :检测被该注解标注的方法是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings:压制警告
其中jdk1.7之后引入了另外两个基本注解:
@SafeVarargs : Java7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
@FunctionalInterface : Java8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable: Java8 开始支持,标识某注解可以在同一个声明上使用多次
class="language-html">其中@Override、@Deprecated、@SuppressWarnings、@SafeVarargs和@FunctionalInterface在class="tags" href="/tags/JAVA.html" title=java>java.lang包下,而@Repeatable在class="tags" href="/tags/JAVA.html" title=java>java.lang.annotation包下

4.2:4个元注解

  元注解(meta-annotation):定义注解的注解

       4.2.1:class="language-html">@Target

class="language-html">@Target:用于描述注解能够作用的范围,可取的值存于ElementType枚举类中。

       ElementType的取值范围:

取值注解使用范围
TYPEclass="language-html">作用于类或者接口上
FIELD可作用于成员变量上
METHODclass="language-html">作用于方法上
ANNOTATION_TYPE(了解)class="language-html">作用于注解类型上(被@interface修饰的类型)
CONSTRUCTOR(了解)class="language-html">作用于构造方法上
LOCAL_VARIABLE(了解)class="language-html">作用于局部变量上
PACKAGE(了解)可用class="language-html">作用于记录class="tags" href="/tags/JAVA.html" title=java>java文件的package信息
PARAMETER(了解)class="language-html">作用于参数上
TYPE_PARAMETER(了解)可用于标注类型参数(jdk 1.8后支持)

  TYPE_USE(了解)

可用于标注任何类型名称(jdk 1.8后支持)

      4.2.2:@Retention

class="language-html">@Retention:表示在什么级别保存该注解信息。可取的值存于RetentionPolicy枚举类中。

     RetentionPolicy的取值范围:

取值注解使用范围
SOURCE注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
CLASS注解在class文件中可用,但会被VM丢弃(该类型的注解信息会保留在源码和class文件里,在执行的时候,不会加载到虚拟机中),请注意,当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override、@Deprecated、@SuppressWarnning等
RUNTIME注解信息将在运行期(JVM)也保留,因此可以通过class="tags" href="/tags/FanShe.html" title=反射>反射机制读取注解的信息(源码、class文件和执行的时候都有注解的信息),如SpringMvc中的@Controller、@Autowired、@RequestMapping等。

     4.2.3:class="language-html">@Documented(了解)

class="language-html">@Documented:此注解会被class="tags" href="/tags/JAVA.html" title=java>javadoc工具提取成文档

      4.2.4:class="language-html">@Inherited(了解)

class="language-html">@Inherited:允许子类继承父类中的注解

 5.Annotation的属性

从前面我们可以得知Annotation的本质是一个接口,既然是接口,那么自然能定义抽象方法。

我们把注解中的抽象方法称为注解的属性。

注解中属性的返回值类型有5种

  1. 基本数据类型
  2. String
  3. 枚举
  4. 注解
  5. 以上类型的数组
  1.    如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
  2.    如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
  3.    数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

   5.1简单演示

class="language-class="tags" href="/tags/JAVA.html" title=java>java">package com.hanyxx.annotaion;
import class="tags" href="/tags/JAVA.html" title=java>java.lang.annotation.*;
/**
 * @author 菠菜饭团
 * @description: 自定义注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BoCai {
    String name() default "菠菜饭团";
    ElementType[] value() default ElementType.TYPE ;
    String className();
    String methodName();
}

需求:通过注解的形式创建任意对象,并且执行任意方法:

class="language-class="tags" href="/tags/JAVA.html" title=java>java">package com.hanyxx.annotaion;
import class="tags" href="/tags/JAVA.html" title=java>java.lang.reflect.Method;
/**
 * @author 菠菜饭团
 * @description: 通过注解的形式创建任意对象,并且执行任意方法
 */
@BoCai(className="com.hanyxx.annotaion.PlayGame",methodName = "play")
public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        /**
         *  <A extends Annotation> A getAnnotation(Class<A> annotationClass) :如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。
         *  Annotation[] getAnnotations() : 返回此元素上存在的所有注解。
         */
        //1.获取类字节码对象
        Class<AnnotationTest> annotationClass = AnnotationTest.class;
        //2.获取该类的注解对象(本质是在内存中生成该注解接口的子类实现对象)
        BoCai boCai = annotationClass.getAnnotation(BoCai.class);
        //3.获取传入的类名和方法名
        String className = boCai.className();
        System.out.println("获取类名:"+className);
        System.out.println("===========================");
        String methodName = boCai.methodName();
        System.out.println("获取方法名:"+methodName);
        System.out.println("===========================");
        //4.加载类进内存,并获取方法对象
        Class<?> Cls = Class.forName(className);
        Method method = Cls.getMethod(methodName);
        //5.创建对象实例并调用方法
        Object o = Cls.newInstance();
        method.invoke(o);
    }
}

执行结果如下:


http://www.niftyadmin.cn/n/902192.html

相关文章

使用@Autowire注解代码飘红问题的解决方案

1. 使用Autowire注解代码飘红问题 解决方案&#xff1a;如果不是依赖没有导入&#xff0c;那么就是IDEA的代码检查机制在作妖。 File–>Settings–>输入 inspections 进行搜索&#xff0c;然后输入 autowired 进行搜索&#xff0c;将idea的代码检查改为Warning即可

Md5接口加密工具类

import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random;/**** ClassName&#xff1a;MD5Utils* Description: 加密工具类* date 2019-08-07 18:37*//** * MD5加密算法工具类 * */ …

【图解】我的IDEA配置-2019.3.5(一)

IDEA官网下载地址&#xff1a; https://www.jetbrains.com/idea/download/#sectionwindows 0.设置导航栏字体大小 1.设置全局项目编码 File–>settings 2.设置全局自动编译 3.增大字号&#xff0c;同时设置粗体&#xff1a; 5.debugger模式能够进入jdk源码查看&#xf…

手机号和座机号的验证工具类

import java.util.regex.Matcher; import java.util.regex.Pattern;/*** date 2018/11/12*/ public class PhoneUtil {/*** 手机号验证** param str* return 验证通过返回true*/public static boolean getMobile(String str) {Pattern pattern null;Matcher matcher null;boo…

【源码注释】Ribbon的负载均衡策略以及自定义配置

Spring Cloud Ribbon的负载均衡策略以及自定义配置 1. Ribbon是一个基于HTTP和TCP的客户端负载均衡工具&#xff0c;它基于NetFlix Ribbon实现&#xff0c;可以将面向服务的REST请求自动转换为客户端负载均衡的服务调用。 2. 核心组件 com.netflix.loadbalancer.IRule类是所…

java集合—List 、 Set、 Map详解

一、集合与数组 数组&#xff08;可以存储基本数据类型&#xff09;是用来存现对象的一种容器&#xff0c;但是数组的长度固定&#xff0c;不适合在对象数量未知的情况下使用。 集合&#xff08;只能存储对象&#xff0c;对象类型可以不一样&#xff09;的长度可变&#xff0…

RabbitMQ安装图文教程

1. RabbitMQ是使用erlang语言写的,所以安装RabbitMQ前要先安装erlang RabbitMQ和erlang版本对应关系: https://www.rabbitmq.com/which-erlang.html erlang下载地址:https://www.erlang.org/downloads 下载后一路安装,然后配置环境变量(以23.1版本为例). 配置环境变量: ERL…

【图文】linux环境安装jdk1.8并配置环境变量

写在前面&#xff1a; 安装环境准备&#xff1a; 操作系统&#xff1a; CentOS7.5 64位 JDK版本&#xff1a; 1.8 工具&#xff1a;Xshell 7Xftp 7 1. oracle官网下载jdk&#xff08;以jdk-8u281-linux-x64.tar.gz为例&#xff09; fty25ADC123!# 下载地址&#xff1a;https:…