单元测试、反射、注解、动态代理

JUnit单元测试的实现过程是什么样的?

必须导入Junit框架的jar包。 定义的测试方法必须是无参数无返回值,且公开的方法。

测试方法使用@Test注解标记。

JUnit测试某个方法,测试全部方法怎么处理?

成功的标志是什么 测试某个方法直接右键该方法启动测试。

测试全部方法,可以选择类或者模块启动。 红色失败,绿色通过。

注解

说明

@Test 

测试方法

@Before

用来修饰实例方法,该方法会在每一个测试方法执行之前执行一次。

@After

用来修饰实例方法,该方法会在每一个测试方法执行之后执行一次。

@BeforeClass

用来静态修饰方法,该方法会在所有测试方法之前只执行一次。

@AfterClass

用来静态修饰方法,该方法会在所有测试方法之后只执行一次。

反射概述

反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。

在运行时,可以直接得到这个类的构造器对象:Constructor

在运行时,可以直接得到这个类的成员变量对象:Field

在运行时,可以直接得到这个类的成员方法对象:Method

这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。

反射的基本作用、关键? 反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。

反射的核心思想和关键就是:得到编译以后的class文件对象。

反射的第一步是什么? 获取Class类对象,如此才可以解析类的全部成分。

获取Class类的对象的三种方式

方式一:Class c1 = Class.forName(“全类名”);

方式二:Class c2 = 类名.class

方式三:Class c3 = 对象.getClass();

使用反射技术获取构造器对象并使用

方法

说明

Constructor[] getConstructors​()

返回所有构造器对象的数组(只能拿public的)

Constructor[] getDeclaredConstructors​()

返回所有构造器对象的数组,存在就能拿到

Constructor getConstructor​(Class... parameterTypes)

返回单个构造器对象(只能拿public的)

Constructor getDeclaredConstructor​(Class... parameterTypes)

返回单个构造器对象,存在就能拿到

反射得到的构造器可以做什么? 依然是创建对象的 public newInstance(Object... initargs)

如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象 setAccessible(boolean) 反射可以破坏封装性,私有的也可以执行了。 

Class类中用于获取成员变量的方法

方法

说明

Field[] getFields​()

返回所有成员变量对象的数组(只能拿public的)

Field[] getDeclaredFields​()

返回所有成员变量对象的数组,存在就能拿到

Field getField​(String name)

返回单个成员变量对象(只能拿public的)

Field getDeclaredField​(String name)

返回单个成员变量对象,存在就能拿到

反射得到成员变量可以做什么?

依然是在某个对象中取值和赋值。

void set​(Object obj, Object value) 、 Object get​(Object obj)

如果某成员变量是非public的,需要打开权限(暴力反射),然后再取值、赋值 setAccessible(boolean) 

Class类中用于获取成员方法的方法

方法

说明

Method[] getMethods​()

返回所有成员方法对象的数组(只能拿public的)

Method[] getDeclaredMethods​()

返回所有成员方法对象的数组,存在就能拿到

Method getMethod​(String name, Class... parameterTypes) 

返回单个成员方法对象(只能拿public的)

Method getDeclaredMethod​(String name, Class... parameterTypes)

返回单个成员方法对象,存在就能拿到

 反射得到成员方法可以做什么?

依然是在某个对象中触发该方法执行。 Object invoke​(Object obj, Object... args)

如果某成员方法是非public的,需要打开权限(暴力反射),然后再触发执行setAccessible(boolean)

反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以为集合存入其他任意类型的元素。

泛型只是在编译阶段可以约束集合只能操作某种数据类型,在编译成Class文件进入运行阶段的时候,其真实类型都是ArrayList了,泛型相当于被擦除了。

反射的作用?

可以在运行时得到一个类的全部成分然后操作。

可以破坏封装性。

(很突出) 也可以破坏泛型的约束性。

(很突出) 更重要的用途是适合:做Java高级框架

基本上主流框架都会基于反射设计一些通用技术功能。

注解概述、作用

对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。单元测试、反射、注解、动态代理_第1张图片

特殊属性: value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写!! 但是如果有多个属性,  且多个属性没有默认值,那么value名称是不能省略的。 

元注解是什么? 注解注解的注解。

@Target约束自定义注解可以标记的范围。  @Retention用来约束自定义注解的存活范围。

与注解解析相关的接口

Annotation: 注解的顶级接口,注解都是Annotation类型的对象

AnnotatedElement:该接口定义了与注解解析相关的解析方法 。

方法

说明

Annotation[]    getDeclaredAnnotations()

获得当前对象上使用的所有注解,返回注解数组。

T getDeclaredAnnotation(Class annotationClass)

根据注解类型获得对应注解对象

boolean isAnnotationPresent(Class annotationClass)

判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

动态代理 

代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。

关键步骤 1.必须有接口,实现类要实现接口(代理通常是基于接口实现的)。 3.创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象。

动态代理的优点:

非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。 可以为被代理对象的所有方法做代理。 可以在不改变方法源码的情况下,实现对方法功能的增强。 不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。

你可能感兴趣的:(单元测试,jar,java)