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 |
返回单个构造器对象(只能拿public的) |
Constructor |
返回单个构造器对象,存在就能拿到 |
反射得到的构造器可以做什么? 依然是创建对象的 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中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。
特殊属性: value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写!! 但是如果有多个属性, 且多个属性没有默认值,那么value名称是不能省略的。
元注解是什么? 注解注解的注解。
@Target约束自定义注解可以标记的范围。 @Retention用来约束自定义注解的存活范围。
与注解解析相关的接口
Annotation: 注解的顶级接口,注解都是Annotation类型的对象
AnnotatedElement:该接口定义了与注解解析相关的解析方法 。
方法 |
说明 |
Annotation[] getDeclaredAnnotations() |
获得当前对象上使用的所有注解,返回注解数组。 |
T getDeclaredAnnotation(Class |
根据注解类型获得对应注解对象 |
boolean isAnnotationPresent(Class |
判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false |
代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。
关键步骤 1.必须有接口,实现类要实现接口(代理通常是基于接口实现的)。 3.创建一个实现类的对象,该对象为业务对象,紧接着为业务对象做一个代理对象。
动态代理的优点:
非常的灵活,支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。 可以为被代理对象的所有方法做代理。 可以在不改变方法源码的情况下,实现对方法功能的增强。 不仅简化了编程工作、提高了软件系统的可扩展性,同时也提高了开发效率。