【大数据】学习笔记 1 Java SE 第7章 面向对象基础(下) 7.4 注解

【大数据】学习笔记

在这里插入图片描述

1 Java SE

第7章 面向对象基础(下)

7.4 注解
7.4.1 什么是注解

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

@SuppressWarnings(value=”unchecked”)
@Override
@Deprecated

注解Annotation是从JDK5.0开始引入。

虽然说注解也是一种注释,因为它们都不会改变程序原有的逻辑,只是对程序增加了某些注释性信息。不过它又不同于单行注释和多行注释,对于单行注释和多行注释是给程序员看的,而注解是可以被编译器或其他程序读取的一种注释,程序还可以根据注解的不同,做出相应的处理。所以注解是插入到代码中以便有工具可以对它们进行处理的标签。

7.4.2 三个最基本的注解

【1】@Override

​ 用于检测被修饰的方法为有效的重写方法,如果不是,则报编译错误!

​ 只能标记在方法上。

​ 它会被编译器程序读取。

【2】@Deprecated

​ 用于表示被标记的数据已经过时,不建议使用。

​ 可以用于修饰 属性、方法、构造、类、包、局部变量、参数。

​ 它会被编译器程序读取。

【3】@SuppressWarnings

​ 抑制编译警告。

​ 可以用于修饰类、属性、方法、构造、局部变量、参数

​ 它会被编译器程序读取。

示例代码:

package com.dingjiaxiong.annotation;

import java.util.ArrayList;

/**
 * @Projectname: BigDataStudy
 * @Classname: TestAnnotation
 * @Author: Ding Jiaxiong
 * @Date:2023/4/27 13:38
 */

public class TestAnnotation {
    
    
    @SuppressWarnings("all")
    public static void main(String[] args) {
    
    
        int i;

        ArrayList list = new ArrayList();
        list.add("hello");
        list.add(123);
        list.add("world");

        Father f = new Son();
        f.show();
        f.methodOl();
    }
}

class Father {
    
    
    @Deprecated
    void show() {
    
    
        System.out.println("Father.show");
    }

    void methodOl() {
    
    
        System.out.println("Father Method");
    }
}

class Son extends Father {
    
    
/*	@Override
    void method01() {
        System.out.println("Son Method");
    }*/
}

在这里插入图片描述

7.4.3 JUnit

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。

要使用JUnit,必须在项目的编译路径中必须引入JUnit的库,即相关的.class文件组成的jar包。如何把JUnit的jar添加到编译路径如图所示:

后面会学习maven,在maven仓库中统一管理所有第三方框架和工具组件的jar,但是现在没有学习maven之前,可以使用本地jar包。

【1】引入本地JUnitjar

第一步:在当前IDEA项目目录下建立junitlibs,把下载的JUnit的相关jar包放进去:

Junit 官网:https://junit.org/junit5/

在这里插入图片描述

仓库https://github.com/junit-team/junit5/releases/tag/r5.9.3

在这里插入图片描述

在这里插入图片描述

笔者先下载4吧

https://junit.org/junit4/

在这里插入图片描述

在这里插入图片描述

直接下载这个jar 包

在这里插入图片描述

在这里插入图片描述

https://repo1.maven.org/maven2/junit/junit/4.13.2/

在这里插入图片描述

下载下来

在这里插入图片描述

放到我们的工程中

在这里插入图片描述

第二步:在项目中添加Libraries库

在这里插入图片描述

在这里插入图片描述

OK

第三步:选择要在哪些module中应用JUnit库

在这里插入图片描述

第四步:检查是否应用成功

在这里插入图片描述

编译时生效

注意Scope:选择Complie,否则编译时,无法使用JUnit。

第5步:下次如果有新的模块要使用该libs库,这样操作即可

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

记得改成compile

【2】编写和运行@Test单元测试方法

JUnit4版本,要求@Test标记的方法必须满足如下要求:

  • 所在的类必须是public的,非抽象的,包含唯一的无参构造的。
  • @Test标记的方法本身必须是public,非抽象,非静态的,void无返回值,()无参数的。
package com.dingjiaxiong.junit;

import org.junit.Test;

/**
 * @Projectname: BigDataStudy
 * @Classname: TestJUnit
 * @Author: Ding Jiaxiong
 * @Date:2023/4/27 14:05
 */

public class TestJUnit {
    
    
    @Test
    public void test01() {
    
    
        System.out.println("TestJUnit.test01");
    }

    @Test
    public void test02() {
    
    
        System.out.println("TestJUnit.test02");
    }

    @Test
    public void test03() {
    
    
        System.out.println("TestJUnit.test03");
    }
}

在这里插入图片描述

在这里插入图片描述

这里直接报错,看起来是有什么东西没找到

谷歌了一下,是版本问题,在4.11版本起,junit jar包不在包含hamcrest。

https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/

在这里插入图片描述

下载下来放到我们的工程中

在这里插入图片描述

再试一次

在这里插入图片描述

没问题。【当然如果不想依赖这个jar,可以把junit 的版本降一降】

【3】设置执行JUnit用例时支持控制台输入

idea64.exe.vmoptions配置文件中加入下面一行设置,重启idea后生效。

需要注意的是,要看你当前IDEA读取的是哪个idea64.exe.vmoptions配置文件文件。如果在C盘的用户目录的config下(例如:C:\Users\Irene\.IntelliJIdea2019.2\config)也有一个idea64.exe.vmoptions文件,那么将优先使用C盘用户目录下的。否则用的是IDEA安装目录的bin目录(例如:D:\ProgramFiles\JetBrains\IntelliJ_IDEA_2019.2.3\bin)下的idea64.exe.vmoptions文件。

-Deditable.java.test.console=true

在这里插入图片描述

7.4.4 自定义注解

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

@SuppressWarnings(value=”unchecked”)
@Override
@Deprecated

注解Annotation是从JDK5.0开始引入。

虽然说注解也是一种注释,因为它们都不会改变程序原有的逻辑,只是对程序增加了某些注释性信息。不过它又不同于单行注释和多行注释,对于单行注释和多行注释是给程序员看的,而注解是可以被编译器或其他程序读取的一种注释,程序还可以根据注解的不同,做出相应的处理。所以注解是插入到代码中以便有工具可以对它们进行处理的标签。

一个完整的注解应该包含三个部分:
(1)声明
(2)使用
(3)读取

【1】元注解

JDK1.5在java.lang.annotation包定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

(1)@Target:用于描述注解的使用范围

  • 可以通过枚举类型ElementType的10个常量对象来指定
  • TYPE,METHOD,CONSTRUCTOR,PACKAGE…

(2)@Retention:用于描述注解的生命周期

  • 可以通过枚举类型RetentionPolicy的3个常量对象来指定
  • SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
  • 唯有RUNTIME阶段才能被反射读取到

(3)@Documented:表明这个注解应该被 javadoc工具记录。

(4)@Inherited:允许子类继承父类中的注解

示例代码:

package java.lang;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
    
    
}
package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Target({
    
    TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    
    
    String[] value();
}
package java.lang;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={
    
    CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
    
    
}

【2】自定义注解

[1] 声明自定义注解

【元注解】
【修饰符】 @interface 注解名{
    
    
    【成员列表】
}
  • 自定义注解可以通过四个元注解@Retention,@Target,@Inherited,@Documented,分别说明它的声明周期,使用位置,是否被继承,是否被生成到API文档中。
  • Annotation 的成员在 Annotation 定义中以无参数有返回值的抽象方法的形式来声明,我们又称为配置参数。返回值类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
  • 可以使用 default 关键字为抽象方法指定默认返回值
  • 如果定义的注解含有抽象方法,那么使用时必须指定返回值,除非它有默认值。格式是“方法名 = 返回值”,如果只有一个抽象方法需要赋值,且方法名为value,可以省略“value=”,所以如果注解只有一个抽象方法成员,建议使用方法名value。
package com.dingjiaxiong.annotation;

import java.lang.annotation.*;

/**
 * @Projectname: BigDataStudy
 * @Classname: Table
 * @Author: Ding Jiaxiong
 * @Date:2023/4/27 14:18
 */

@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    
    
    String value();
}
package com.dingjiaxiong.annotation;

import java.lang.annotation.*;

/**
 * @Projectname: BigDataStudy
 * @Classname: Column
 * @Author: Ding Jiaxiong
 * @Date:2023/4/27 14:19
 */

@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    
    
    String columnName();

    String columnType();
}

[2] 使用自定义注解

package com.dingjiaxiong.annotation;

/**
 * @Projectname: BigDataStudy
 * @Classname: Student
 * @Author: Ding Jiaxiong
 * @Date:2023/4/27 14:19
 */

@Table("t_stu")
public class Student {
    
    
    @Column(columnName = "sid", columnType = "int")
    private int id;
    @Column(columnName = "sname", columnType = "varchar(20)")
    private String name;

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    @Override
    public String toString() {
    
    
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44226181/article/details/130470077