枚举是JDK1.5新增的引用数据类型,和类,接口是一个级别的,定义枚举的关键字为
enum
。
java.lang.Enum
类,是所有枚举的父类。
枚举的本质就是一个类的多个对象。
枚举的定义
格式:
public enmu 枚举名{}
枚举常量定义:
枚举中的常量名字大写,多个常量之间逗号分开,最后一个常量可以写分号,也可以不写。每一个常量,都表示这个类的对象。修饰符为
public static final
。
枚举中有默认的无参数的private修饰的构造方法,如果手写构造方法,也必须是私有修饰的。而且构造方法必须写在常量的后面,这时最后一个常量就必须要写分号。
public enum Color {
//枚举的静态常量
RED,GREEN,YELLOW
public enum Color{
//枚举静态常量,直接为变量color赋值
RED("红色"),GREEN("绿色"),YELLOW("黄色");
private String color;
priate Color(String color){
this.color = color ;
//省略get/set
枚举的使用
由于枚举的常量为静态修饰可以直接枚举名.调用
public static void main(String[] args){
MyEnum myEnum = MyEnum.GREEN;
System.out.println(myEnum);
System.out.println(myEnum.getName());
测试分类:
黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
白盒测试:需要写代码的。关注程序具体的执行流程。
Junit介绍
Junit是一个Java语言的单元测试框架,属于白盒测试,简单理解为可以用于取代java的main方法。Junit属于第三方工具,需要导入jar包后使用。
Junit的使用
编写测试类,简单理解Junit可以用于取代java的main方法。
在测试类方法上添加注解 @Test。
@Test修饰的方法要求:public void 方法名() {…} ,方法名自定义建议test开头,没有参数。
添加Junit库到lib文件夹中,然后进行jar包关联。
使用:点击方法左侧绿色箭头,执行当前方法(方法必须标记@Test)。执行结果红色:代表失败;执行结果绿色:代表成功。
哪个方法想使用单元测试,就在方法上,添加注解: @Test
该方法的返回值类型,必须写为void
该方法必须没有参数列表
方法上右键运行,运行的是含有@Test注解的方法
类上右键运行,运行的是类当中含有@Test注解的所有方法
绿条: 正常运行
红条: 出现问题,异常了
@Test,用于修饰需要执行的测试方法。
@Before,修饰的方法会在测试方法之前被自动执行。
@After,修饰的方法会在测试方法执行之后自动被执行。
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射机制,如下图。
反射的好处:
可以在程序运行过程中,操作这些对象。
可以解耦,提高程序的可扩展性。
获取Class对象的方式
获取class对象方式
获取Student类的class文件对象:
public static void main(String[] args)throws Exception{
Student student = new Student();
Class c1 = student.getClass();
System.out.println(c1);
Class c2 = Student.class;
System.out.println(c2);
Class c3 = Class.forName("com.doit.communication.Student");
System.out.println(c3);
4.3 反射获取构造方法
Class类中与Constructor相关方法
1. Constructor[] getConstructors()
获取所有的public修饰的构造方法
2. Constructor getConstructor(Class... parameterTypes)
根据参数类型获取构造方法对象,只能获得public修饰的构造方法。
如果不存在对应的构造方法,则会抛出 java.lang.NoSuchMethodException 异常。
参数是可变参数,调用此方法时,可以不写参数,获取的空参构造
可以写参数,给定的参数必须是Class对象
参数 String name,int age
调用此方法: String.class,int.class
Constructor类中常用方法
1. T newInstance(Object... initargs)
根据指定参数创建对象。
2. T newInstance()
空参构造方法创建对象。
获取无参数构造方法
public static void main(String[] args)throws Exception{
Class cla = Class.forName("com.doit.communication.Student");
//获取无参数构造方法
Constructor constructor = cla.getConstructor();
//运行构造方法
Object object = constructor.newInstance();
System.out.println(object);
获取有参数构造方法
public static void main(String[] args)throws Throwable{
Class cla = Class.forName("com.doit.communication.Student");
//获取有参数构造方法
Constructor constructor = cla.getConstructor(String.class, int.class);
//运行构造方法,传递实际参数
Object object = constructor.newInstance("张三",20);
System.out.println(object);
反射获取构造方法的简单方式
Class类中定义了方法 T newInstance()
,可以直接运行获取到的构造方法。
要求:被反射的类中必须有public权限的无参数构造方法。
public static void main(String[] args)throws Throwable{
Class cla = Class.forName("com.doit.communication.Student");
Object object = cla.newInstance();
System.out.println(object);
反射成员方法执行
Class类中与Method相关方法
1. Method[] getMethods()
获取所有的public修饰的成员方法,包括父类中。
2. Method getMethod("方法名", 方法的参数类型... 类型)
根据方法名和参数类型获得一个方法对象,只能是获取public修饰的
Method类中常用方法
Object invoke(Object obj, Object... args)
返回值Object,表示调用方法后,该方法的返回值
根据参数args调用对象obj的该成员方法
如果obj=null,则表示该方法是静态方法
反射获取无参数方法
public static void main(String[] args)throws Throwable{
Class cla = Class.forName("com.doit.communication.Student");
Object object = cla.newInstance();
//获取study方法
Method method = cla.getMethod("study");
//执行方法,传递对象
method.invoke(object);
反射获取有参数方法
public static void main(String[] args)throws Throwable{
Class cla = Class.forName("com.doit.communication.Student");
Object object = cla.newInstance();
//获取有参数的方法eat
Method method = cla.getMethod("eat",String.class,double.class);
//调用eat方法,传递实际参数
method.invoke(object,"吃饭",9.9);
需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
将需要创建的对象的全类名和需要执行的方法定义在配置文件中
在程序中加载读取配置文件
使用反射技术来加载类文件进内存
注意:需要将配置文件放在src目录下,放在src目录下的任何文件,都会被编译到classes目录下,这样做的目的是为了让配置文件跟随编译后的class文件一起,因为交付用户使用的是class文件,而不是源代码。
如何读取src目录下的文件:使用类的加载器ClassLoader类的方法 :
InputStream getResourceAsStream(String name)
此方法返回输入流,该流从类目录下读取文件
参数传递文件名
properties文件:
className=com.doit.domain.Student
methodName=sleep
Student类:
package com.doit.domain;
public class Student {
public void sleep(){
System.out.println("sleep...");
RefectTest测试类:
public static void main(String[] args)throws Throwable{
//获取RefectTest类的加载器
ClassLoader classLoader = RefectTest.class.getClassLoader();
//加载器获取输入流,读取pro.properties文件
InputStream inputStream = classLoader.getResourceAsStream("pro.properties");
Properties properties = new Properties();
//集合IO关联
properties.load(inputStream);
//获取集合中的键值对,类名
String className = properties.getProperty("className");
//获取集合中的键值对,方法名
String methodName = properties.getProperty("methodName");
//反射获取指定类的class文件对象
Class cla = Class.forName(className);
Object object = cla.newInstance();
//获取指定的方法
Method method = cla.getMethod(methodName);
//运行方法
method.invoke(object);