一、测试
测试分类:
黑盒测试:不需要写代码,给输入值,看程序是否能输出期望值
白盒测试:写代码测试,关注程序具体执行流程
Junit:白盒测试
1.定义一个测试类
2.定义测试方法:可以独立运行
3.给方法添加@Test注解
4.导入Junit依赖环境
判定结果:红色代表失败,绿色代表成功
补充:(无论运行结果是正确还是错误,被修饰的方法都会执行)
@Before:修饰分方法会在测试方法执行之前被自动执行
@After:修饰的方法会在测试方法执行之后自动执行
public class CalculateTest {
@Test
public void testAdd(){
Calculate c = new Calculate();
System.out.println("calculate...");
int result = c.add(1,2);
//断言,我断言这个结果是三
// Assert.assertEquals(2,result);
Assert.assertEquals(3,result);
}
//初始化方法,用于资源的申请
@Before
public void init(){
System.out.println("init...");
}
//结束方法,用于资源的释放
@After
public void close(){
System.out.println("end...");
}
}
二、反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
获取Class对象的方法:
1. Class.forName("全类名”): 将字节码文件加载进内场,返回Class对象
多用于配置文件,读取文件,加载类
2. 类名.class: 通过类名的属性class获取
多用于参数传递
3. 对象.getClass(): getClass() 方法在Object类中定义着
多用于对象的获取字节码的方式
Class cls1 = Class.forName("cn.xmz.pr2001.pr11.reflect.Person");
System.out.println(cls1);
//2. 类名.class: 通过类名的属性class获取
Class cls2 = Person.class;
System.out.println(cls2);
// 3. 对象.getClass(): getClass() 方法在Object类中定义着
Class cls3 = new Person().getClass();
System.out.println(cls3);
使用Class对象(功能):
获取功能: 获取成员变量,构造方法,成员方法类名(具体参看文档Class)
public class ReflectTest {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
// Person person = new Person();
// person.eat();
Properties pro = new Properties();
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(obj);
}
}
注解(说明程序,给程序员看的):
作用分类:
1. 编写文档:通过代码里的标识的元数据生成文档(生成文档doc文档)
2. 代码分析:对代码进行分析(使用反射)
3. 让编译器能实现基本的编译检查【override】
JDK中预定义的一些注解:
Override(检查是否是继承是实现接口)
Deprecated(标注的内容表示已过时)
SuppressWarnings(“all”):压制警告
自定义注解:本质是一个接口,默认继承Annotation接口
格式:元注解--》描述注解的注解
public @interface 注解名{}
属性:接口可以定义的抽象方法
要求:返回值类型(基本数据类型,string,枚举,注解,以上类型的数组)
定义了属性在使用时要赋值
元注解:@Target(描述注解能作用的位置)
ElementType取值:
1.TYPE可以作用于类上
2.METHOD可以作用于方法上
3.FIELD可以作用于成员变量上
@Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(描述注解被保留的阶段)
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented(描述注解是否被抽取到api文档中)
@Inherited(描述注解是否被子类继承)
在程序使用(解析)注解:获取注解定义的属性值
1. 获取注解定义的位置的对象(Class,Method,Field)
2. 获取指定的注解 getAnnotation(Class)
3. 调用注解中的抽象方法获取配置的属性
Class<ReflectTestAnno> reflectTestClass = ReflectTestAnno.class;
Pro an = reflectTestClass.getAnnotation(Pro.class);
String className = an.className();
String methodName = an.methodName();
System.out.println(className);
System.out.println(methodName);
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method method = cls.getMethod(methodName);
method.invoke(obj);
来源:CSDN
作者:皮蛋咸鱼白菜粥
链接:https://blog.csdn.net/qq_36603180/article/details/103940979