JavaEE学习笔记2
对应代码地址
Note for JavaEE-Day2
Stream & IO
文件输入/输出
- 字节输入输出流超类。还是基于面向对象的思想,输出流为
OutputStream
类,定义形如OutputStream os = new FileOutputStream("test.txt")
。同理,输入流定义形如InputStream is = new FileInputStream("test.txt")
。相关操作如下:os.write()
输出数据os.flush()
将buffer中的数据全部写入至文件。因写入操作是异步的。is.available()
返回整型数据表示文件大小。is.read()
从文件读入数据。默认按字符(char)
- 字符输入输出。对应输入输出类分别为
FileReader
和FileWriter
,定义中的参数为相应文件的对象。输出中该对象可以由File file = new File("Hello.txt")
生成。 - 加载资源文件。。
使用形式如:InputStream input = PropertiesLoader(即加载资源类的类名).class.getResourceAsStream("/default.properties")
、Properties props = new Properties()
以及props.load(input)
。这三者正如这里展示的那样需要一起使用,分别获取输入流、资源类以及将输入加载到资源中。 - 文件读写。文件读形如整文件读
string s = Files.readString(Path.of("路径"))
、按行读取List<String> s = File.readAllLines(Path.of("路径"))
,文件写形如File.write(Path.of("路径"),二进制文件/按行文本)
和File.writeString(Path.of("路径"),"文本内容",编码模式)
。
小结:
总体上这部分就是一些方法的调用知识,后面可能会根据使用情况补充。
泛型
-
基本。前面提到的List就是典型的泛型,即类在声明中对属性不确定其类型,在定义时再指出,这样在方便复用之余也提高了类型安全性。
-
类型参数。修饰泛型的类型参数的相关语句应放置于类型参数之前,形如
public static <T extends Comparable<T> > T maximum(){}
。
反射
我的理解就是通过接口获得类的信息如字段等,再利用这些信息对应的类完成各项操作。其功能范围很广,小到获得字段,大到创建对象、修改属性权限都可以实现。
- 获得反射对象的三种方法:
- Class.forName(“类路径”);
- (类名).class
- (实例化的类对象).getClass()
- 反射使用示例。
- 获取字段。
getFields()
获取public字段,getDeclaredFields()
获取private和public字段。 - 修改权限。
setAccessible(true/false)
允许私有属性读写。注意此处需先获取字段以使用字段调用。 - 获取方法。
getMethods()
获取public方法,getDeclaredMethods()
获取private和public方法。 - 反射实例化。实例化
newInstance()
,也可以先反射获取构造方法,再以此实例化,也使用newInstance()
。使用方法形如(方法对象).invoke(类对象,"方法名")
。
- 获取字段。
注解
- 基础介绍。注解是一种特殊的注释,可以编译为字节码并在程序运行时起作用。
- 作用机制。对于内置注解,编译器读取注解并根据注解进行相关操作,如检查覆写等。
- 自定义注解。声明形如
public @interface xxx{}
。下面是几个对自定义注解的注解:@Documented
表面这个注解应该被javadoc工具记录,默认情况下javadoc不记录注解。@Retention(保留参数)
用于指定注解被保留的阶段,有如下三个参数值:RetentionPolicy.SOURCE
: 源码级别保留,编译时忽略RetentionPolicy.CLASS
: 编译时保留,在class文件中保存,JVM忽略RetentionPolicy.RUNTIME
: 由JVM加载到内容,通过反射机制读取和使用
@Target({元素类型集合(如方法、字段)})
用于指定被标注的参数类型。如果没有明确指明,可以在任意位置使用。@Inherited
被标注的自定义注解若标注一个父类,其注解的属性可以由子类继承。
- 反射获取注解。使用方法是先通过反射获取字段,如
(类名).class.getDeclaredFields()
,而后通过循环字段和field.isAnnotationPresent((注解名).class)
判断当前字段是否与目的注解对应,最后通过field.getAnnotation((注解名).class)
方法获取注解。
maven
maven安装与配置
Idea有内置maven,但我还是去官网下载后重新配置了一下,之后添加环境变量和在setting文件里加一下镜像即可。而后在idea中使用maven时需要在项目setting的maven选项中更改maven路径和setting文件指向本地配置的位置。
maven项目结构
src/main/java
:源代码src/main/resources
: 资源文件src/test/java
: 源代码target
: 构造结果,即类和jar包pom.xml
: 项目描述文件。其内部信息如下:- modelVersion: 版本号,设置为4.0.0
- groupId: 项目组id,如edu.whu
- artifactId: 项目id,如mavenDemo
- version: 项目组下项目版本id
- properties: 项目类型变量,如UTF-8编码
- dependency: 导入依赖jar包,其中scope标签有下面4种取值:
- compile(默认): 编译时使用
- test: 编译Test时使用
- runtime: 编译时不用运行时用
- provided: 编译时使用,运行时由JDK或某个服务提供
maven运行流程
依赖管理通过解析pom.xml得到项目信息、依赖及插件等,送至仓库导出插件和依赖以分别执行Compile、Test以及Install的生命周期。
Unit Testing-单元测试
JUnit基本介绍
JUnit是对java应用的一项开源单元测试框架。其好处有如下几点
- 测试代码与功能代码分开
- 可以一次性运行多组测试样例
- 可以生成测试报告
- 与几乎所有的java开发的ide、工具和框架兼容。
这里也顺便指出测试的四个流程步骤:
- 单元测试-开发者
- 整合测试-开发者与测试人员
- 系统测试-测试人员
- 用户接受测试-终端用户/顾客
JUnit使用
- 使用前需先在pom.xml中引入junit依赖。
@Test
注解指示方法为测试方法,这些方法会像main方法一样运行。- 通过断言语句来进行测试。断言语句例如:
assertTrue()
、asserFalse()
、assertNoyNull()
以及assertArrayEquals()
。 @BeforEach
与@AfterEach
注解。注解的方法将分别在test方法之前和之后自动执行。- 测试异常。通过
assertThrows(IllegalmentException.class,new Exception(){})
或assertThrows(IllegalmentException.class,()->{})
进行测试,即异常方法或lambda表达式。
单元测试优点
- 通过确保每个系统组件以达到一个有质量的产品。
- 简化调试过程。
- 允许代码重构和设计优化。(因为测试与主代码块分离)。
- 在生命周期的早期修正bug。
- 减少修bug的开销。
单元测试的FIRST原则
- F:Fast。单元测试的执行应足够快。
- I:Isolate。单元测试之间应互不依赖。
- R:Repeatable。单元测试应与环境无关,可以在各种环境下得出相同的结果。
- S:Self-validating。单元测试应能通过本身决定测试通过与否,即测试答案是自定的。
- T:Thorough & Timely。单元测试应全面的包括好的情况与坏的情况;单元测试应及时的在制作某个特性时创建。
注意事项
- java对应package下的类不能直接被其他类import,需要先新建一个packa将其或所有文件放入。