menu

Java Web 基础加强

单元测试

* 测试分类:
	1.黑盒测试:不需要写代码,提供输入,检查输出是否符合期望
	2.白盒测试:需要编写代码,关注程序的具体执行流程(junnit)

junit单元测试

* 使用步骤:
	* 1. 定义一个测试类(测试用例)
		* 建议:
			* 测试类名:被测试类名Test
			* 包名:xxx.xxx.xxx.test
	* 2. 定义测试方法:可以独立运行
		* 建议:
			* 方法名:test测试的方法名 如testAdd()
			* 返回值:void,测试只用看结果即可,不需要返回值
			* 参数列表:建议空参
	* 3. 给方法加注解,即junit注解 @Test
	* 4.导入junit依赖
* 判定结果
	* 红色:失败
	* 绿色:成功
	* 一般使用断言操作处理结果
		* Assert.assertEquals(expected,actual)
	

	* 补充
		* @Before
			* 被修饰的方法会在所有测试方法执行前自动执行
		* @After
			* 被修饰的方法会在所有测试方法结束后自动执行

反射

定义

把类的各个组成部分封装为其他对象(成员变量,构造方法,成员方法)

##IDEA提示原理

IDEA内部会把类的字节码文件加载进内存,在内存中有一个Class类对象,Class类对象里边已经把所有的方法抽取出来,封装为Method对象,然后把所有方法放到了Method数组里面。当需要提示的时候,只需要把数组成员加载在idea提示列表里即可。

* 好处
	* 1 可以在程序运行过程中操作这些对象
	* 2 解耦,提高程序的可扩展性 ##获取Class对象的方式
* 方式	   
	* Class.forname("全类名") --包含包名,将字节码文件加载进内存,返回Class对象
		* 多用于配置文件中,将类名定义在配置文件中。读取文件,加载类
	* 类名.class --已经将字节码文件加载进内存,已有了Class对象的情况下使用
		* 多用于参数传递 
	* 对象.getClass --已有对象的情况下,该方法封装在Object类里面,所有对象都继承了该方法
		* 用于对象获取字节码 

* 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取Class对象都是同一个。

* Class对象功能
	* 获取成员变量
		* Field[] 	getFields() --获取所有public修饰的成员变量
		* Field 	getField(String name) --获取指定名称的public修饰的成员变量
		* Field[] 	getDeclareFields() --可获取private修饰的成员变量
		* Field 	getDeclareField(String name)
	* 获取构造方法
		* Constructor<?> getConstructors() 
		* Constructor<T> getConstructor(类<?>... parameterTypes)  
		* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 
		* Constructor<?>[] getDeclaredConstructors()  
	* 获取成员方法 
		* Method 	getMethod(String name, 类<?>... parameterTypes)  
		* Method[] 	getMethods()  
		* Method 	getDeclaredMethod(String name, 类<?>... parameterTypes)  
		* Method[] 	getDeclaredMethods()  
	* 获取类名 
		* String 	getName()
		
*  Field:成员变量
	* 操作:
		* 设置值 void 	set(Object obj, Object value) 
		* 获取值 Object 	get(Object obj)
		* 忽略访问权限修饰符的安全检查(暴力反射) setAccessible(true)
* Constructor:构造方法
	* 创建对象:
		* T newInstance(Object... initargs)
		
		* 如果使用空参数构造方法获取对象。操作可以简化:Class对象的newInstance方法
* Method:方法对象
	* 执行方法:
		* Object invoke(Object obj, Object ... args)
	* 获取方法名称:
		* String getName	

注解

* 概念:用来说明程序。面向计算机。为JDK1.5引入的新特性。
* 注释:用文字描述程序。面向程序员。
	* 如@Override,它会检查被该注解所标识的方法是否是重写了父类的方法,若不是则编译失败

* JDK预定义注解 
	* @Override --它会检查被该注解所标识的方法是否是重写了父类的方法(接口),若不是则编译失败
	* @Deprecated --该注解标识的内容,表示已过时
	* @SuppressWarnings --压制警告,一般传递参数all

* 自定义注解
	* 格式:
		* 元注解
		  public @interface 注解名称{}
	* 本质:接口
		* public interface 注解名称 extent java.lang.annotation.Annotation {}
	
	* 属性:接口中的抽象方法
		* 要求:
			* 属性的返回值类型 --基本数据类型,String,枚举,注解,以及相关的数组
			* 使用时需给属性赋值
				* 如果定义属性时,使用default关键字默认初始化值,则使用注解时,可以不进行属性的赋值
				* 如果只有一个属性需要赋值且属性的名称为value,则直接定义值,不需要写value
				* 数组赋值时,值使用{}包裹,若{}只有一个值,可以省略{}

	* 元注解:用于描述注解的注解
		* @Target --描述注解能够作用的位置(类or方法)
			* ElementType取值
				* TYPE --类
				* METHOD --方法
				* FIELD --成员变量 
		* @Retention --描述注解被保留的阶段
			* RetentionPolicy
				* RUNTIME --当前描述的注解保留到class字节码文件中,并被jvm读取(自定义比较常用)
				* CLASS --不会被jvm读取
				* SOURCE --不会保留到字节码中
		* @Documented --描述注解是否被抽取到API文档中
		* @Inherited --描述注解是否被子类继承,即子类会继承父类的注解
* 解析注解:获取注解中定义的属性值	
	* 获取注解定义所在位置的对象 --Class,Method,Field等
	* 获取指定的注解
		* getAnnotation(Class)
	* 调用注解中的抽象方法获取配置的属性值	
 其实就是在内存中生成了一个该注解接口的子类实例对象
			
  public class ProImpl implements Pro{
      public String className(){return ""};
      public String methodName(){return ""};
  }
  
调用注解定义的抽象方法获取返回值,自定义注解里面全是抽象方法