java基础-注解

本文深入解析Java注解的概念、用途及实现方式,包括注解的基本使用、自定义注解、元注解等内容,并介绍了Servlet 3.0中注解的应用。

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

本文旨在复习学习的知识点,整理成笔记。参考了java3y的Java知识点。注解就这么简单-java3y


在Servlet和Filter的开发过程中,为了方便配置web.xml文件,可以直接使用@WebServlet@WebFilter来简化操作。

1 什么是注解

注解:Annotation

注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。

  • 注解它不是注释,注释是程序员写的,给程序员看的。
  • 注解给程序看,用于描述程序如何运行及在什么阶段来运行。
  • 注解在实际开发中,最大的功能是用于替换配置文件。
  • 注解是jdk1.5的新特性
  • 可以通过反射来让注解具有功能
  • 注解的格式: @xxxx
  • 注解它的本质就是一个接口,这个接口需要继承 Annotation接口

2 为什么需要用到注解

在之前编写Servlet的过程中,我们需要对web.xml进行配置文件。
在这里插入图片描述
利用注解的功能之后,我们可以一句话在Servlet类中一句代码解决。
在这里插入图片描述
可以看到,这样就简化了操作,且表现更为直观。并且Servlet规范是推崇这种配置方式的

3 三个基本的注解

  • @Override: 检查子类确实是覆盖/重写了父类的方法。
    父类:
    在这里插入图片描述
    子类:
    在这里插入图片描述
  • @Deprecated: 说明注解的方法已经过时了。
  • @SuppressWarnings({“unused”,“deprecation”}):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告
    在这里插入图片描述
  • @SafeVarargs:java7“堆污染”警告
  • @FunctionalInterface:用来指定该接口是函数式接口

4 如何声明注解

Step1:声明一个注解 @interface 注解名{}
Step2: 声明注解中的成员(以下为注解中的属性类型)

  • 1.基本类型
  • 2.String
  • 3.枚举类型
  • 4.注解类型
  • 5.Class类型
  • 6.以上类型的一维数组类型

Step3:注解使用
声明注解
在这里插入图片描述
使用注解
在这里插入图片描述

模拟Junit中的@Test(单元测试方法)

Step1:先写一个MyTest.java注解

@Retention(RetentionPolicy.RUNTIME) //该注解的生命周期保留到运行时
//@Target(ElementType.METHOD)//这个注解只能在方法上面用
//@Target(ElementType.FIELD)//这个注解只能在属性上面用
public @interface MyTest {
    String name() default "gyf";
}

Step2:写一个测试类Demo.java

public class Demo {
   // @MyAnnotation(age=12,name="gyf",values={"gz","sz"},clazz = String.class)

    @MyTest(name = "zhansan")
    public void test1(){
        System.out.println("test1方法执行了。");
    }

    @MyTest()
    public void test2(){
        System.out.println("test2方法执行了。");
    }

    public void test3(){
        System.out.println("test3方法执行了。");
    }
}

Step3:写个TestRunner

/**
 1. 注解的工作原理
 2. 1.通过反射获取方法
 3. 2.通过方法获取方法上面声明的注解对象
 4. 3.通过注解对象可以获取注解声明的一些参数
 5. 4.通过反射来调用方法
 */
public class TestRunner {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
        //执行Demo里单元测试两个方法
        //1.通过反射来获取方法
        Method[] methods = Demo.class.getMethods();
        for(Method m : methods){
            if(m.getName().startsWith("test")){//只有以test开头的方法才是单元测试方法
                //2.通过反射来获取方法上的注解
                MyTest myTest = m.getAnnotation(MyTest.class);
                System.out.println(m.getName() + "是否有MyTest注解:" + myTest);
                if(myTest != null){
                    System.out.println("name=" + myTest.name());
                    //执行注解下面的方法
                    m.invoke(Demo.class.newInstance());
                }
            }
        }
    }
}

5 元注解

什么是元注解

只能用在注解上的注解叫做元注解。(即:用于修饰注解的注解)

  • 自定义的注解的存活范围(生命周期):默认是CLASS。
    在这里插入图片描述

  • @Retention:作用。改变自定义的注解的存活范围
    RetentionPolicy:SOURCE、CLASS、RUNTIME

  • @Target:作用。指定该注解能用在什么地方。
    ElementType:TYPE、METHOD、FIELD、ANNOTATION_TYPE

  • @Documented:作用,使用了@MyTest的注解的类,如果@MyTest注解上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。

  • @Inherited:作用,说明该注解可以被继承下去。

6.Servlet3.0中的2个常用注解

WebServlet

@WebServlet("\Servlet")
@WevSErvlet(name="Servlet")

WebFilter

@WebFilter("/*)
@WebFilter(filterName="myFilter",urlPatterns="/*");

补充:

自定义注解的信息注入到方法中

利用反射技术
步骤:

  • 反射出该类的方法
  • 通过方法得到注解上具体的信息
  • 将注解上的信息注入到方法上
  • 注入对象到方法或成员变量上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值