01 Junit单元测试,黑盒、白盒测试,反射,注解,枚举
一、junit单元测试(注意断言的使用)
二、黑盒测试、白盒测试
三、反射(将类的各个部分封装成其他对象就是反射)
1.反射的好处
a、可以在程序的运行中操作这些对象
b、可以解耦,提高程序的可扩展性
2.
3.获取字节码Class对象的三种方式
a. Class.forName(String name); 经常用的
将字节码文件加载进内存,返回Class对象,多用于配置文件,将类名定义在配置中,读取文件,加载类
b.类名.class
多用于参数的传递
c.对象名.getClass() getClass方法时Object类的方法
多用于对象的获取字节码的方式
4.反射结论
同一个字节码文件(*.class),在一次程序的运行过程中,都只会被加载一次,无论通过哪种方式获取的class对象都是同一个
5.Class类常用方法
Class对象功能:
* 获取功能:(有Declared的是获取所有修饰的)
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
2. 获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
注意:类<?>... parameterTypes 传入参数为,类.class并且可以传递多个,如:全参构造方法中有String name 那么将传递String.class
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
3. 获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name, 类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4. 获取全类名
* String getName()
3.反射练习
* 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
1.创建pro.properties配置文件
className =cn.itcast.reflect.Person
methodName = sleep
2.Person类
public void sleep(){
System.out.println("person的sleep....");
}
3.Student类
public void sleep(){
System.out.println("student的sleep...");
}
4.框架类
public class Test {
public static void main(String[] args) throws Exception {
//加载配置文件
Properties p = new Properties();
//获取类加载器
ClassLoader classLoader = Test.class.getClassLoader();
//读取数据
InputStream inputStream = classLoader.getResourceAsStream("pro.properties");
p.load(inputStream);
//获取配置文件中的className,methodName
String className = p.getProperty("className");
String methodName = p.getProperty("methodName");
//加载类进入内存中
Class<?> aClass = Class.forName(className);
//创建对象
Object obj = aClass.newInstance();
//获取方法对象
Method method = aClass.getMethod(methodName);
//执行方法
method.invoke(obj);
}
}
四、枚举
1.枚举反编译结果:
public final class Person extends java.lang.Enum<Person> {
public static final Person P1;
public static final Person P2;
public static final Person P3;
public static Person[] values();
public static Person valueOf(java.lang.String);
static {};
}
本质上就是一个类,它默认继承了java.lang.Enum<T>
它的属性本质上就是自己当前的类对象;
测试枚举:
可以创建一个类通过反编译
通过javap命令
五、注解