Java基础学习完结:【Junit、反射、注解】

  • A+

内容介绍

  • 1  单元测试Junit
  • 2  反射
  • 3  注解

Junit单元测试

概述

  • JUnit是一个Java语言的单元测试
  • 单元:一个方法就是一个单元
  • 测试: 测方法中的代码逻辑是否正确

作用

  • 替代main方法 一个类只能有一个main方法 如果有N个功能要单独测试的话,需要写N个类由N个main方法进行不同的测试
    如果使用单元测试会让程序功能的测试更加简单

实现方式

  • JUnit的使用步骤
    • 1.导JUnit单元测试的jar包 (idea开发工具已经集成了junit的jar包)
    • 2.在类中要测试的方法上添加 @Test
    • 3.测试执行
  • JUnit的细节整理
    • 1.方法必须得是公共的
    • 2.返回值必须得是void
    • 3.方法不能有任何的参数
  • 常见注解
    • @Test: 单元方法测试
    • @Before:在每个测试方法之前都会运行一次
    • @After:在每个测试方法运行以后运行的方法
  • 了解注解
    • 静态方法可以使用
    • @BeforeClass
    • @AfterClassps:会在 @Before之前执行 会在 @After之后执行

反射

概述

  • 反射是一种行为,利用该行为可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法成员

Java基础学习完结:【Junit、反射、注解】

类:
    构造方法
    成员方法
    成员变量
 一个类的执行流程:
hello.java    ---编译-->hello.class ---加载内存-->jvm创建了Class对象用来记录数据--->运行
Student.java  ---编译-->Student.class---加载内存-->jvm创建了Class对象用来记录数据--->运行  
Person.java   ---编译-->Person.class---加载内存-->jvm创建了Class对象用来记录数据--->运行  
如何拿到类中的数据:
Class(字节码对象): 接收一切类的字节码文件
    Constructor(构造器对象): 接收类中的一切构造方法
    Method(方法对象): 接收类中的一切成员方法
    Field(变量对象): 接收类中的一切成员变量

作用

  • 通过反射可以获取到每个类的字节码对象,拿到其中的构造方法,成员方法和成员变量

ps应用场景: 后期我们要学的ssm框架底层用到了很多的反射行为,为了后面能够更加理解框架,这里需要同学们对反射机制熟练化

核心实现

获取字节码对象的三种方式(面试题–重要)

  • 方式1:通过类名.class获取
  • 方式2:通过Object类的成员方法getClass()方法获取
  • 方式3:通过Class.forName(“全限定名”)方法获取ps全限定名: 就是包名 + 类名

相关API(Class, Constructor,Method,Field)

1. Class对象相关方法
- String getName() 获取全限定名,包含 包名+类名
- String getSimpleName() 获得简单类名,只是类名,没有包名
- Object newInstance() 创建此 Class 对象所表示的类的一个实例。要求:类必须有公共的无参数构造方法
2. 操作构造方法(Constructor)
- Constructor getConstructor(Class... parameterTypes)
  根据参数类型获取构造方法对象,只能获得public修饰的构造方法。  
- Constructor getDeclaredConstructor(Class... parameterTypes)
  根据参数类型获取构造方法对象,包括private修饰的构造方法。       
- T newInstance(Object... initargs) 
  根据构造器中的指定参数创建对象。 
- void setAccessible(true)
  暴力反射,设置为可以直接访问私有类型的构造方法 
- Constructor[] getConstructors()   (了解)
  获取所有的public修饰的构造方法 
- Constructor[] getDeclaredConstructors()   (了解)
  获取所有构造方法,包括privat修饰的
3. 操作方法(Method)

Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。

- Method getMethod("方法名", 方法的参数类型... 类型)
  根据方法名和参数类型获得一个方法对象,只能是获取public修饰的 
- Method getDeclaredMethod("方法名", 方法的参数类型... 类型)
  根据方法名和参数类型获得一个方法对象,包括private修饰的 
- Object invoke(Object obj, Object... args)  核心方法 
  使用反射的方式让一个方法执行 
  obj  :   要执行该方法的对象 
  args  :  方法运行过程中需要的参数 
- void setAccessible(boolean flag)
  暴力反射,设置为true可以直接调用私有修饰的成员方法  
- Method[] getMethods() (了解)
  获取所有的public修饰的成员方法,包括父类中。 
- Method[] getDeclaredMethods() (了解)
  获取当前类中所有的方法,包含私有的,不包括父类中。
4. 操作属性(Field)

Field是属性类,类中的每一个属性(成员变量)都是Field的对象,通过Field对象可以给对应的成员变量赋值和取 值。

- Field getField(String name)
  根据属性名获得属性对象,只能获取public修饰的 
- Field getDeclaredField(String name)
  根据属性名获得属性对象,包括private修饰的 
- Field[] getFields()(了解)
  获取所有的public修饰的属性对象,返回数组。 
- Field[] getDeclaredFields()(了解)
  获取所有的属性对象,包括private修饰的,返回数组 
- getType()  (了解)
  获取字段类型 
- set(字段所属的对象,要赋的值)
  给字段赋值的,如果是私有的还是要先暴力破解

反射明确的点:框架

1 获取字节码对象的方式
2 如何根据字节码对象获取各种构造器让各种构造器创建对象
3 如何根据字节码对象获取各种方法让各种方法执行
4 如何根据字节码对象获取各种字段给各种字段赋值

注解

概述:

  • 在java中由一个 @+一堆英文单词组成的集合 就是注解
  • 它可以声明在类、字段、方法、局部变量、方法参数上等,用来对程序进行限制说明的
 注释:给程序员看的
 注解:给程序去看的   声明不同的注解可以让程序做不同的功能
 注解的学习明确:
          1 明确java或者框架提供的注解都有什么功能
          2 明确提供的注解能定义在哪个位置上 (类上 字段上 方法上 局部变量上)

jdk中的注解

  • @Override 限制该方法是重写的方法
  • @Deprecated 声明该方法不推荐使用

扩展:自定义注解(理解)

  • 格式:
    • public @interface 注解名称{ 类型 属性名(); ………} 注解本质上就是一个特殊的接口注解中的方法叫做属性.
  • 属性:
    • 基本类型 (byte,short,int,long,float,double,boolean,char)
    • String
    • Class
    • Annotation
    • 以上类型的一维数组

常见注解

@英文字符 底层:要不就是没属性 要不属性全部有默认值

@英文字符(属性名1=属性值1,属性名2 = 属性值2) 底层:注解设置属性 没有给默认值 需要使用的时候设置

@英文字符(“abcd”) 底层:注解的属性中只有一个 且名称叫value

  • 注意事项:
    • 注解一旦有了属性,使用注解时,必须给属性赋值
    • 注解名称如果为value,那么属性名称可以省去不写
自定义注解小结:
    1.自定义注解格式: public @interface 注解名称{}
    2.注解可以使用在类,方法,接口,成员变量,局部变量....
    3.注解中的方法不叫方法,叫属性
    4.当注解中有属性时,使用该注解时,必须给注解中的属性赋值
    5.当只给value属性赋值时,value属性名可以省去不写

元注解

定义在注解之上的注解被称为元注解

  • @Target 定义该注解作用在什么上面 常用值为:
    • METHOD:方法
    • TYPE:类 接口
    • FIELD:字段
  • @Retention 定义该注解保留到那个代码阶段(存活时期) 值为:
    • SOURCE:注解只在源码上保留
    • CLASS:注解在源码和字节码上保留
    • RUNTIME:注解在所有的阶段都保留 (常用)

解析注解

反射机制

  • method.isAnnotationPresent(注解.class):判断方法上是否有指定的注解
  • method.getAnnotation(注解.class);获取方法上指定的注解

案例2-自定@MyTest注解,实现单元测试的功能

历史上的今天
十月
1
  • 资源分享QQ群
  • weinxin
  • 官方微信公众号
  • weinxin
沙海
一个Java基础入门的教程视频
C语言郝斌老师教程
网站https安全证书安装,伪静态配置
美女讲师教你学C语言

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: