/**
Juunit单元测试
反射
注解
测试:黑盒测试:不需要写代码 给输入值 看程序是否能够输出期望的值
2.白盒测试:需要些代码的 灌注程序具体的执行流程
使用步骤:
1.定义一个测试类(测试用力),建议:1.测试类名:被测试的类名+test
包名xxx.xxx.xx.test
定义的方法:可以独立运行 建议:方法名:test测试的方法名 testadd();
返回值:void
参数列表:空参
3.给方法加@Test
4.导入Junit依赖
判定结果:红色代表失败 绿色代表成功
5.断言操作:我断言一个结果 与结果进行比较
Assert类中的某个方法(你期望的值,真实的值)
初始化方法:
用于自愿申请 所有测试方法在执行之前都会限制性该方法
@Before
public void init(){
}//释放资源方法 在所有测试方法执行完后,都会自动执行该方法
@After
public void close(){
}
@Test
public void testSub(){
需要测试的语句
}
反射:框架设计的灵魂
框架:半成品的软件
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:可以在程序运行过程中 操作这些对象 可以解耦 提高程序的可拓展性
获取class对象的方式:
1.Class.forName("全类名"):将字节码文件夹在到内存 返回class对象
->多用于配置文件,将类名定义在配置文件中 读取文件 加载类
2.类名.class:通过类名的属性class获取->多用于参数的传递
3.对象.getClass:getclass()方法在object类中定义着->多用于对象的获取字节码的方式
结论:无论通过哪种方式获取的Class对象是同一个
Class对象功能:
获取功能:1.获取成员变量们
Field[] getFileds 返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段 类对象。
获取所有public修饰的所有变量
field getFileds(String name)返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
Field[] getDeclaredFields() 返回的数组 Field对象反映此表示的类或接口声明的所有字段 类对象。
Field getDeclaredField(String name) 返回一个 Field对象,它反映此表示的类或接口的指定已声明字段 类对象。
->>>>获取所有的成员变量 不仅仅是public,但是在访问不是public的成员变量时,忽略访问权限修饰符的安全检查 d.setAccessible(Ture)
写上这么一行代码就可以了
2.获取构造方法们
Constructor<T> getConstructor(类<?>... parameterTypes) ->返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
Constructor<?>[] getConstructors() ->返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) ->返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
Constructor<?>[] getDeclaredConstructors() ->返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类
创建对象 T newInstance(Object initargs):如果使用空参数构造方法创建独享,操作可以简化:class对象的newInstance方法
3.获取成员方法们
方法 getMethod(String name, 类<?>... parameterTypes) ->返回一个 方法对象,它反映此表示的类或接口的指定公共成员方法 类对象。
方法[] getMethods() ->返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和超接口继承的声明。
方法 getDeclaredMethod(String name, 类<?>... parameterTypes) ->返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 类对象。
方法[] getDeclaredMethods() ->返回包含一个数组 方法对象反射的类或接口的所有声明的方法,通过此表示 类对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法。
Method:方法对象
Objecr invoke(Object obj,Object ..args)
获取方法名称 String grtNmae:获取方法名
4.获取类名
String getName()
返回由 类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String 。
Field的两个方法
1.设置值void set(Object obj, Object value) ->将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
2.获取值Object get(Object obj) 返回该所表示的字段的值 Field ,指定的对象上。
注解:说明程序 给计算机看的 JDK1.5之后的新特性 是为了说明程序的
使用注解:@注解名称
作用的分类:1.编写代码
2.代码分析
3.编译检查
JDK中预定的一些注解:
@Override:检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@Suppresswarnings:压制警告
@Suppresswarnings(all):压制全部警告
自定义注解:格式:
元注解:public @interface 注解名称{
}
注解的本质上就是一个接口 该接口默认继承Annotation接口
注解的属性--接口中可以定义的内容----->接口中定义的抽象方法
要求:1.属性的返回值类型->基本数据类型 String 枚举 注解 和以上类型的数组
定义了一个属性,要给属性赋值
1.赋值的时候定义属性时使用default关键字给属性默认初始化值,则使用注解时可以不对属性赋值
2.如果只有一个属性需要赋值 并且属性的名称为value时,则可以直接定义值
3.数组赋值时,值使用{}抱过 如果数组中只有一个值 则{}省略
元注解:用于描述原注解的注解
@Target:描述注解能够作用的位置
EkementType取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
@Retantion:描述注解被保留的阶段
SOURVE 表示被描述的注解不会保留到class字节码文件中也不会被JVM读取到
CLASS:表示被描述的注解会保留到class字节码文件中并不会被JVM读取到
RUNTIME:一般使用这个 表示被描述的注解会保留到class字节码文件中并被JVM读取到
@Documented:描述注解是否被抽去到API文档中
@Inherited:描述注解是否被子类继承
在程序中国使用(解析)注解:获取注解中定义的属性值
1.获取注解顶的位置对象(Class,Method,Field)
2.获取指定的注解:getAnnotation(Class)
其实就是在内存中生成了一个该注解接口的子类实现对象
3 调用注解中的抽象方法获取配置的属性值
小结:以后大多数的时候 我们会使用注解 而不是自定义注解
2.注解给谁用1.编译器2.给解器程序使用
3.
注解不是程序的一部分 可以理解为注解就是一个标签
*/