一、Junit单元测试
导入Junit依赖后,可以自定义测试类,在方法前加上:
@Test
那么可以单独执行这个方法。
断言:Assert.assertEquals(期望的结果,运算的结果);
常常使用断言来判断是否与期望的结果一致
@Before:
修饰的方法会在测试方法之前被自动执行
@After:
修饰的方法会在测试方法执行之后自动被执行
二、反射
将类的各个部分,封装成一个个的对象,就是反射
类对象未被new创建前,会被Class类保存在内存中。
Java文件的三个阶段:source阶段,class阶段,runtime阶段
- 获取Class对象的方式:
1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2. 类名.class:通过类名的属性class获取
多用于参数的传递
3. 对象.getClass():getClass()方法在Object类中定义着。
多用于对象的获取字节码的方式
三、反射访问非public的部分
Field类、Constructor类、Method类都有setAccessible(true)方法,可以让忽略访问权限的检查,这样就能访问非public的部分了
Class类中的方法可以来获取Field类、Constructor类、Method类的对象
1. 获取成员变量们
Field[] getFields() :获取所有public修饰的成员变量
Field getField(String name) 获取指定名称的 public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
2. 获取构造方法们
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
3. 获取成员方法们:
Method[] getMethods()
Method getMethod(String name, 类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4. 获取全类名
String getName()
Field类可以来设置成员变量
1. 设置值
void set(Object obj, Object value)
2. 获取值
get(Object obj)
3. 忽略访问权限修饰符的安全检查
setAccessible(true):暴力反射
Constructor类可以来新建对象
Constructor:构造方法
创建对象:
T newInstance(Object... initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
Method类可以来执行方法
执行方法:
Object invoke(Object obj, Object... args)
获取方法名称:
String getName:获取方法名
使用反射的好处,可以仅仅修改配置文件执行不同类中的不同方法,而不用修改类文件。
四、注解
比如像是@Override就是一个注解
注解的作用:
①编写文档:通过代码里标识的注解生成文档(Javadoc)
【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析
【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JDK内置的注解:
@Deprecated
可以标记方法已经过时了,但是还是可以使用。
@Override
判断是不是重写了父类的方法
自定义注解
格式:
元注解:用来解释注解的注解
public @interface 注解名称{
属性列表;
}
元注解:用于描述注解的注解
@Target:描述注解能够作用的位置
ElementType取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
属性的数据类型:
基本数据类型
String
枚举
注解
以上类型的数组
使用注解的方式加载配置文件信息
* 在程序使用(解析)注解:获取注解中定义的属性值
1. 获取注解定义的位置的对象 (Class,Method,Field)
2. 获取指定的注解
getAnnotation(Class)
//其实就是在内存中生成了一个该注解接口的子类实现对象
public class ProImpl implements Pro{
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
3. 调用注解中的抽象方法获取配置的属性值
关于注解
1. 以后大多数时候,我们会使用注解,而不是自定义注解
2. 注解给谁用?
①. 编译器
②.给解析程序用
3. 注解不是程序的一部分,可以理解为注解就是一个标签