【JavaWeb】课程介绍及前言引入
课程介绍
- Java web框架
- 课程安排:
数据库 -> 前端 -> web -> 项目实践 - 后期学习:
SSM框架:简化web开发的经典框架 ->
spring boot:简化spring开发的框架 ->
spring cloud:微服务开发解决方案 ->
中间件技术 ->
docker:容器技术 ->
业务解决方案
导入
Junit单元测试
以前我们通常是新建test类写main方法去测试,现在可以使用Junit进行测试
步骤 :
- 定义一个测试类(测试用例)
- 建议 :
- 测试类名:被测试的类名 TestCalculatorTest
- 包名 : xxx,xxx.xx.test cn.itcast.test
- 定义测试方法:可以独立运行
- 建议 :方法名: test测试的方法名 testAdd()
- 返回值 :void
- 参数列表:void
- 给方法加@Test
- 引入Junit依赖执行
结果:
使用断言判断测试结果是否正确:Assert.assertEquals(expected, result)
提高代码复用
反射——框架设计的灵魂
- Class类对象:用来描述编译后的字节码对象
- 反射:将类的各个组成部分封装为类对象
- 用处:
- 可以在运行时获取操作对象,比如定义了String对象时能自动找到该类的方法
- 可以解耦,提高程序的可扩展性
获取Class对象的三种方法:
- class.forName(“全类名”) : 将字节码文件加载进内存,返回class对象(源代码阶段)
- 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 spring配置文件的原理
- 类名.class:通过类名的属性class获取(类对象阶段)
- 多用于参数的传递
- 对象.getCClass() :getClass()方法在obiect类中定义
- 多用于对象的获取字节码的方式
- 结论
同一个字节码文件(*,class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的lass对象都是同一个。
使用Class对象:
- 获取成员变量:
Field[] getFields()
获取所有public成员
Field getField(string name)
Field[] getDeclaredFields()
获取所有的成员,不考虑修饰符
Field getDeclaredField(string name)
Field : 成员变量
设置值:void set(object obj, object value)
获取值:get(object obj)
忽略访问权限修饰符的安全检查:setAccessible(true)
暴力反射
- 获取构造方法:
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor:构造方法
创建对象:T newInstance(object... initargs)
如果使用空参数构造方法创建对象,可以不用获取构造函数,简化为class对象的newInstance方法
- 获取成员方法:
Method[] getMethods()
Method getMethod(string name,类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(string name,类<?>... parameterTypes)
Method:方法对象
获取方法名称:String getName()
执行方法:Object invoke(Object obj, Object…args)
Method eatMethod = cls.getMethod(eat, Sting.class);
Person p = new Person();
eatMethod.invoke(p, "rice");
- 获取类名:
String getName()
案例
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建对象
- 执行方法
注解
- 注解:用来说明程序的
- 作用:
- 生成文档:
javadoc .java文件
生成doc文档 - 代码分析:
- 编译检查:让编译器实现基本的编译检查 如override
- 生成文档:
JDK内置注解
@Override
检测该注解标注的方法是否是继承自父类(接口)的
@Deprecated
表示该注解标注的内容已过时
@SuppressWarnings
忽略警告 一般传递参数all:@SuppressWarnings("all")
自定义注解
- 定义:
public @interface 注解名称{}
- 本质:注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
- 属性:指接口中的抽象方法
- 属性的返回值类型有下列取值
1.1 基本数据类型
1.2 String
1.3 枚举
1.4 注解
1.5 以上类型的数组 - 定义了属性,在使用时需要给属性赋值
2.1 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
2.2 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
2.3 数组赋值时,值使用{}包裹。如果数组中只有一个值,则可以省略。
- 属性的返回值类型有下列取值
public @interface MyAnno {
int value() default 1;
String name();
}
- 元注解:描述注解的注解
@Target
:描述注解作用的位置:类、方法、变量上
@Retention
:描述注解被保留的阶段
@Documented
:描述注解是否用于生成api文档
@Inherited
:描述注解是否被子类继承
案例:用注解简化配置文件
在程序使用(解析)注解: 获取注解中定义的属性值
- 获取注解定义的位置的对象 (Class, Method, Field)
- 获取指定的注解getAnnotation(Class)
其实就是在内存中生成了一个该注解接口的子类实现对象:
public class ProImpl implements Pro {
public string className() {
return "cn.itcast .annotation .Demo1"
}
public string methodName() {
return "show";
}
}
- 调用注解中的抽象方法获取配置的属性值
案例: 简单的测试框架
当TestCheck类执行主方法时,会自动执行加了check注解的方法,判断方法是否有异常并记录到文件
- 小结:
- 大多数时候,我们都是使用注解,而不是自定义注解
- 注解一般时给编译器和解析的程序用
- 注解不是程序的一部分,可以理解注解为标签