黑马程序员技术交流社区
标题:
[石家庄校区]就业班JavaSE高级部分day14 Junit 反射 注解
[打印本页]
作者:
湿漉漉的文字控
时间:
2018-12-2 15:20
标题:
[石家庄校区]就业班JavaSE高级部分day14 Junit 反射 注解
就业班JavaSE高级部分day14 Junit 反射 注解
JUnit:单元测试
Junit:测试概念
测试代码是否正确,能否达到预期效果
分类:
黑盒测试: 不需要写代码 给定输入值 看程序是否能输出期望的值
白盒测试: 需要写代码, 关注程序的具体执行流程
反射: 框架设计的灵魂
框架:
半成品软件, 可以在框架的基础上进行软件开发,简化代码
反射:
将类的个个组成部分封装成其他对象,成为反射机制
好处:
在程序的运行过程中, 操作这些对象
可以解耦,降低程序的耦合性, 提高程序的可扩展性
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/e5c7c2cf4be3478aae7435ca45803b84/6995398433394c15a462e3ab22a578c2.jpg
获得Class对象的方式:
Source源代码阶段:
Class.forName("类名+包名") (将字节码文件加载到内存,返回Class文件)
多用于配置文件
Class类对象阶段:
类名.class(通过类名的属性class获取)
多用于参数传递
RunTime运行时阶段:
对象.getClass(getClass()方法在Object中定义)
多用于获取字节码对象
同一个字节码文件(*.class)文件在一次程序运行中,只会被加载一次, 不论通过哪种方式获取
Class文件对象和都是同一个
使用Class对象功能:
获取的功能
获取成员变量们
获取所有的成员变量
Field[] getFields(): 获取所有 public 的成员变量
Field getField(String name): 获取指定名称的 public 的成员变量
Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符
Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符
获取构造方法们
Constructor<?>[] getConstructors(): 获取所有 public 的构造方法
Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public
构造方法
Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修
饰符
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定
的构造方法, 不考虑权限修饰符
获取成员方法们
Method[] getMethods(): 获取所有 public 的成员方法
Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的
public 成员方法
Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定
的成员方法, 不考虑权限修饰符
获取类名
String getName(): 获取当前Class对象代表的类的全类名
// 其他
T newInstance(): 使用当前类的空参构造创建一个对象
A getAnnotation(Class<A> annotationClass): 获取当前类的注解对象
ClassLoader getClassLoader(): 返回该类的类加载器
.
注解:
注解
:
Annotation
JDK
1.5
引入
.
也叫元数据
,
是一种代码级别的说明
它可以声明在包
,
类
,
字段
(
成员变量
),
方法
,
局部变量
,
方法参数等的前面
,
用来对这些元素进行说明
注解
:
说明程序的。给计算机看的
注释
:
用文字描述程序的。给程序员看的
使用注解
:
@
注解名称
作用分类
:
1.
编写文档
:
通过代码里标识的注解生成文档
(
生成API文档
@author
@version
@since
@param
@return
)
2.
代码分析
:
通过代码里标识的注解对代码进行分析
(
使用反射
)
(
JUnit提供的
@Test
@Before
@After
)
3.
编译检查
:
通过代码里标识的注解让编译器能够实现基本的编译检查
(
@Override
@FunctionalInterface
)
JDK内置注解
JDK中预定义的一些注解
:
@Override
:
检测被该注解标注的方法是否是
"重写"
父类
(
接口
)
的
@Deprecated
:
该注解标注的内容,表示已过时
@SuppressWarnings
:
压制警告
.
一般传递参数all
@SuppressWarnings
(
"all"
)
自定义注解: 格式和本质
public
interface
接口名
{}
自定义注解格式:关键字
@interface
元注解
public
@interface
注解名称
{
属性
; (
接口中的抽象方法
)
属性
;
属性
;
...
}
@
注解名称
注解的本质:
注解本质上就是一个接口,该接口默认继承Annotation接口
public
interface
MyAnno
extends
java
.
lang
.
annotation
.
Annotation
{}
自定义注解: 属性定义
属性:
接口中的
"抽象方法"
属性的要求:
1.
属性的
"返回值类型"
可以是以下类型
:
基本数据类型
(
8
种
)
String
枚举
注解
以上类型的数组
2.
定义了属性,在使用注解时
,
需要
"给属性赋值"
(
其实是抽象方法的返回值
)
1.
属性使用
default
关键字指定默认值
,
则可以不赋值
2.
如果只有一个名为
"value"
的属性需要赋值
,
则
value
可以省略
,
直接写值即可
3.
给数组赋值时,值使用
{}
包裹。如果数组中只有一个值,则
{}
可以省略
自定义注解: 元注解
元注解:
用于描述注解的注解
常用元注解
:
@Target
:
描述注解能够作用的位置
ElementType枚举的常用取值:
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
示例
:
@Target
(
value
=
{
ElementType
.
TYPE
,
ElementType
.
METHOD
})
@Retention
:
描述注解被保留的阶段
RetentionPolicy枚举的取值
:
SOURCE
:
保留到源代码阶段
CLASS
:
保留到类对象阶段
RUNTIME
:
保留到运行时阶段
示例
:
@Retention
(
RetentionPolicy
.
RUNTIME
)
:保留注解到class字节码文件中并被JVM读取到
@Documented
:
加上后
,
当前注解会被抽取到api文档中
@Inherited
:
加上后
,
当前注解会被子类继承
自定义注解: 解析注解
获取注解属性值的步骤
:
1.
获取注解定义位置的对象
(
Class对象
(
类注解
),
Field对象
(
成员变量注解
),
Method对象
(
方法注解
))
2.
调用
ProAnno
a
=
cls
.
getAnnotation
(
ProAnno
.
class
)
方法获取注解对象
3.
通过注解对象调用抽象方法获取属性值
// 比如获取一个类上的注解
注解类型
注解变量名
=
被注解的类
.
class
.
getAnnotation
(
注解名
.
class
);
数据类型
变量名
=
注解变量名
.
抽象方法
();
ProAnno
proAnno
=
Test
.
class
.
getAnnotation
(
ProAnno
.
class
);
String
className
=
proAnno
.
className
();
String
methodName
=
proAnno
.
methodName
();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2