首页 > 编程语言 >【Java】自定义注解

【Java】自定义注解

时间:2024-12-08 23:33:33浏览次数:6  
标签:Java 自定义 void value class 参数 注解 public

注释和注解不一样

注释是给程序员看的,注解是给程序看的

需要理解Socket,tomcat等内容

一、什么是注解

1. 注解的作用

①:注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。

②:让编译器进行编译检查的作用,比如下边这个@Override注解是重写的意思,子类重写了父类的方法,但是改动了方法名,所以报错。

public class Demo implements Animal{
    public Stringg name ="张三”
    @0verride
    public void aaa(){

    }
}

2. 注解的格式

注解是以“@注释名”在代码当中存在的,还可以添加一些参数值,例如

@SuppressWarnings(value = "unchecked")

3. 注解在哪里使用

可以附加在packageclassmethodfield等上面,相当于给他们添加了额外的辅助信息。我们可以通过反射的方式对这些注解进行访问。

二、注解的类型

一般常用的注解分为三类:

1. 内置注解

@Override:修辞方法的,表示一个方法重写了父类方法

public class Demo extends Objects{
    @Override
    public String toString(){
        return super.toString();    
    }
}

@Deprecated:修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。通俗来说就是遗弃。

public class Demo extends Objects{
    @Deprecated// 表明该方法被遗弃
    public String toString(){
        return super.toString();    
    }
}

@SuppressWarnings:用来抑制编译时的警告信息,括号里的的值包括

 a.deprecation:使用了过时的类或方法的警告
 b.unchecked:执行了未检查时的转换时的警告,集合就是未指定泛型
 c.fall through:当在switch语句使用时发生case穿透
 d.path:在类路径、源文件路径等中有不存在路径的警告
 e.serial:可序列化类上缺少serialVerisonUID定义时的警告
 f.finally:任何finally橘子不能完成时的警告
 g.all:以上所有情况的警告。
 一个 @SuppressWarnings("all"),
 多个 @SuppressWarnings(value={"all","path"})                  
public class Demo{
    public static void run(){
        List list = new ArrayList();   
        // 此时会有 “ Raw use of parameterized class 'List' ” 的警告 
    }
}
public class Demo{
    
    @SupperWarings("all")
    public static void run(){
        // 此时警告解除
        List list = new ArrayList();   
    }
}

2. 元注解

元注解是用于注解的注解,在JDK 1.5中提供了4个标准的用来对注解类型进行注解的注解类

@Target注解:用来描述注解的使用范围,即注解可以使用在什么地方,在定义注解的时候使用这个我们可以更加清晰的知道它的使用范围。

public enum ElementType {
  
    TYPE,              //类,接口

    FIELD,            //成员变量

    METHOD,          //方法

    PARAMETER,       //方法参数

    CONSTRUCTOR,    //构造方法

    LOCAL_VARIABLE,     //局部变量

    ANNOTATION_TYPE,      //注解类
    
    PACKAGE,           // 包

    TYPE_PARAMETER,     //类型参数

    TYPE_USE      //使用类型的任何地方
}

@Retention注解:表示这个注解在什么时候还有效 , 用于描述注解的生命周期

源程序阶段(Source)——xx.java/ xx.class阶段。

类对象阶段(Class)——程序文件被加载到方法区里。

运行时阶段(Runtime

public enum RetentionPolicy {
    SOURCE, // 源文件保留
    CLASS,  // 编译期保留,默认值
    RUNTIME // 运行期保留,可通过反射去获取注解信息,咱们自定义的类一般使用这个
}

小小的例子

@MyAnnotation// 在方法上使用,此处会报错
public class Demo{
    @MyAnnotation
    public static void run(){
        System.out.println("------");    
    }
    public static void main(String[] args){
        run();    
    }
}

@Retention(value = RetentionPolicy.RUNTIME)// 运行期间保留
@Target(value = {ElementType.METHOD})// 作用在方法上面
@interface MyAnnotation{}

@Documented:只是用来标注生成javadoc的时候是否会被记录(了解就好)。

public class Demo{
    @MyAnnotation
    public static void run(){
        System.out.print("------");    
    }
    public static void main(String[] args){
        run();    
    }
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD})
@Documented
@interface MyAnnotation{
    
}

@Inherited:使被它修饰的注解具有继承性 

3. 自定义注解

@interface是用来声明一个注解的,格式public @interface 注解名{定义内容}

其中的每一方法实际上是声明了一个配置参数;

方法的名称就是参数的名称;

返回值类型就是参数的类型(返回值类型只能是基本数据类型,Class,String,enum);

可以通过default来声明参数的默认值;

如果只有一个参数成员,一般参数名称为value;

注解参数必须有值,我们自定义注解元素时,经常使用空字符串,0作为默认值;

public class Demo{
    @MyAnnotation() // 定义了参数,不写参数会报错
    public void run(){
        System.out.print("--------");    
    }
}

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
    // 注解的参数:参数类型+ 参数名()
    String name();
}

public class Demo{
    @MyAnnotation()// 设置了默认参数,不必加参
    public void run(){
        System.out.print("------");    
    }
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
    // 注解的参数:参数类型+ 参数名()
    String name() default "hello";
}
public class Demo{
    @MyAnnotation(name = "goose")
    // 如果有默认值,我们可以赋值也可以不赋值
    // 如果没有默认值,那么必须给注解值
    public void run(){
        System.out.print("------");    
    }
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
    // 注解的参数:参数类型+ 参数名()
    String name() default "hello";
}
public class Demo{
    @MyAnnotation("goose")
    // 此处可以不写name ="xxx"
    // value可以默认不写
    public void run(){
        System.out.print("------");    
    }
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value ={ElementType.METHOD,ElementType.TYPE})
@interface MyAnnotation{
    // 注解的参数:参数类型+ 参数名()
    String name();
}

三、注解实现

1. 自定义注解实现类

@Retention(RetentionPolicy.RUNTIME) //元注解:定义自定义注解的生命周期 ---》在运行期间保留
@Target(value = {ElementType.TYPE}) //元注解:定义自定义注解的作用返回 ---》只能作用在类上边
public @interface WebServlet {
    String urlMapping() default "";    
}

2. 在一个类上使用注解

@WebServlet(urlMapping = "/third")
public class ThridServlet   {
     
}

3. 利用反射获取注解信息

//利用反射获取注信息
public static void getMessage() throws  Exception {
    Class  clazz = Class.forName("com.qcby.MyServletDemo.FirstServlet");
    //获取注解信息
    WebServlet webServlet = (WebServlet) clazz.getDeclaredAnnotation(WebServlet.class);

    System.out.println(webServlet.urlMapping());
}

public static void main(String[] args) throws Exception {
    getMessage();
}

标签:Java,自定义,void,value,class,参数,注解,public
From: https://blog.csdn.net/m0_75260099/article/details/144334416

相关文章

  • 【java】利用aspose.words的ReportingEngine填充word模板
    详情见:https://gitee.com/javadog-net/boot-apose前言⏲️本文阅读时长:约10分钟......
  • 16.在 Vue 3 中使用 OpenLayers 实现自定义地图缩放控件
    前言在前端开发中,地图交互是一个常见且重要的需求。默认情况下,OpenLayers提供了丰富的控件(如缩放、旋转、属性标注等),但有时我们需要根据项目需求自定义交互逻辑,比如禁用默认缩放控件并实现自己的按钮式缩放功能。本文将带大家实现一个自定义地图缩放的功能,通过Vue3的Com......
  • 找出java进程占用cpu高的元凶
    有时候、会查看到服务器负载比较低、应用启动后、会出现java进程占用CPU极高,这种现象比较常见、以下我们分析一下1、使用top -HP15057 查看进程中的线程占用资源情况 2、由此可以看到cpu是pid:15393 线程吃掉了、所以目标锁定在15393上、执行 printf"%x\n"15393......
  • Java根据前端返回的字段名进行查询数据
    在Java后端开发中,我们经常需要根据前端传递的参数(如字段名)来动态查询数据库中的数据。这种需求通常出现在需要实现通用查询功能或者复杂查询接口的场景中。为了实现这个功能,我们需要结合Java的反射机制、MyBatis或JPA等持久层框架,以及SQL动态拼接等技术。本文将详细讲解如何实现这......
  • java ::
    文章目录1.引言简介Java8及其对函数式编程的影响方法引用的引入背景2.方法引用的概念什么是方法引用方法引用与Lambda表达式的关系3.方法引用的类型静态方法引用实例方法引用(对象的实例方法)超类方法的引用类型的实例方法引用(类的任意对象的实例方法)构造方法引用4.......
  • 【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
    ......
  • java读取linux服务器下某文档的内容
    @目录使用步骤:依赖配置文件代码使用步骤:共3步:第一步:添加依赖第二步:配置文件第三步:代码调用依赖<!--java读spark--><dependency><groupId>ch.ethz.ganymed</groupId><artifactId>ganymed-ssh2</artifactId><version>build210</version>......
  • java中“==”和equals,究竟比的是什么
    @目录结论:具体说明:结论:1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的“值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的......
  • A3026 Java+jsp+servlet+mysql高校学生请假管理系统
    高校学生请假管理系统1.摘要2.绪论3.功能结构4.界面展示5.源码获取1.摘要高校学生请假管理系统摘要:随着计算机的发展与不断进步,各个领域都出现了新的技术,曾经各种规模之间的竞争已经发展成为技术之间的竞争,管理和人才之间的竞争,然而计算机技术的发展也离不开软件的......
  • 史上最强Java八股文面试题,堪称2025最强!!!
    1、什么是java序列化,如何实现java序列化   难度系数:⭐序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化......