我的学习之路_第十五章_注解
【Junit 单元测试的基本使用】
1.在要执行的方法上添加一个注解 @Test
2.注解会报错,解决方式 ctr1+1 add juntt
3.选中要执行的方法,右键run as--->junit Test
一次要执行多个方法:选中类,右键run as--->junit Test
【Junit 单元测试的注意事项】
1.没有添加 @Test 注解的方法,不能使用junit运行
2.junit值能运行修饰符为public,返回值类型为void的空参数方法
和单元测试有关的注解:
@Test : 单元测试,可以单独的执行某个方法
@Before : 在单元测试@Test之前执行,可以用来获取一些资源
@After : 在单元测试@Test之后执行,可以用来使用一些资源
★注意: @Before 和 @After 不能单独执行,运行@Test他们会自动执行
【注解】
JDK1.5之后提供的注解
@Deprecated : 表示已经过时的
@Deprecated 可以用来修饰类,表示已经过时的类;也可以用来修饰方法,表示已经过时的方法
已经过时的类和方法,可以使用,但是不建议使用,因为可能存在缺陷,或者被更好的方法取代了.
@Override : 用来测试方法是否为重写的方法
JDK1.5时,@Ocerride只能检测类继承重写的方法
JDK1.6及以上,@Override只能检测类继承类重写的方法,又能检测类实现接口重写的方法
@SuppressWarnings : 表示抑制警告(不人警告显示出来)
@SuppressWarnings使用时必须明确要抑制的是哪个警告
@SuppressWarnings(参数) : 参数是一个字符串数组,
如果只写一个参数,可以忽略{ } ; 如果有多个参数必须使用{ },多个参数之间使用逗号分隔
@SuppressWarnings({"rawtypes","unchecked","unused","deprecation","null","serial"})
可以抑制的警告有:
rawtypes , 忽略类型安全
unchecked , 忽略安全检查
unused , 忽略不使用
deprecation , 忽略过时
null , 忽略空指针
serial , 忽略序列化
all , 忽略所有
★:注解的作用域:可以定义在类上,方法上,代码上
同一位置只能使用一次,同一个注解
【自定义注解】
使用关键字 @interface
定义类:class
定义接口:interface
定义枚举:enum(淘汰)
定义注解:@interface
定义注解的格式:
修饰符 @interface 注解名{
注解的属性;(可以有,可以没有)
}
定义含有属性的注解:
属性相当于类中的成员变量和成员方法
属性的定义格式:
修饰符 返回值类型(数据类型) 属性名() [default 属性值];
修饰符:固定的格式(类似于接口) public abstract ,写不写都是,建议写出,增强阅读性
返回值类型:基本数据类型(4类8中),String类型,class类型,枚举,注解,以上类型的一维数组
[default 属性值] : [] 可选的,属性可以给出默认值,也可以不给默认值
定义一个含有属性的注解
这个注解只有一个属性,属性的名字叫做 value
【元注解】
用来修饰自定义注解的JDK提供的注解
@Retention 用于确定被修饰的自定义注解生命周期
Retention 注解的属性是一个枚举RetentuinPolicy(枚举有3个属性 SOURCE, CLASS, RUNTIME)
作用:指示注释类型的注释要保留多久
如果注释类型生命中不存在Retention注释,则保留策略默认为 RetentionPolicy.CLASS.
RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有,用途:提供给编译器使用.
RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存中没有.用途:JVM java虚拟机使用
RetentionPolicy.RUNTIME 被修饰的坠儿存在源码.字节码.内存(运行时). 用途 : 取代xml配置
@Target 用于确定被修饰的已定义注解使用位置
Target注解的属性是一个枚举ElementType(常用的属性TYPE, CONSTRUCTOR...)
作用: 指示注释类型所使用的程序元素的种类.
如果注释类型申明中不存在Target 元注释,则声明的类型可以用在任意程序元素上.
ElementType.TYPE 修饰类,接口
ElementType.CONSTRUCTOR 修饰构造
ElementTpye.METHOD 修饰方法
ElementTpye.FIELD 修饰字段
使用自定义注解:
格式:@自定义注解的名字(属性名=属性值,属性名=属性值)
★注意:
1.自定义注解没有属性,可以直接使用--->@自定义注解的名字,类似@Deprecated
2.自定义注解有属性,使用的时候,必须使用键值对的方式,给所有属性赋值,才能使用;有默认值的属性可以不用赋值
3.如果注解的属性是一个数组,赋值的时候只有一个值,可以省略{ } ,赋值多个必须写出{ }
4.注解的使用范围,可以用来修饰类,方法,构造方法,变量
5.使用自定义注解,如果只有一个属性,名字叫value,复制的时候value可以省略不写
6.一个对象上(修饰类,方法,构造方法,变量) , 注解只能使用一次,不能重复使用.
【自定义注解的解析】
使用自定义注释,获取自定义注解的属性值.
和解析有关的接口: java.lang.reflect.AnnotatedElement接口
所有已知实现类: AccessibleObject, class, constructor , field , method ,package
接口的方法:
返回值:boolean isAnnotationPresent(Class annotationClass)
如果指定类型的注释存在于此元素上,则返回true,否则返回false.
判断(Constructor,field,method...)有没有指定的注解
参数:注解的class文件对象
返回值:T getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回null
获取(Constructor,Field, method..)上的注解,参数传递的是哪个注解的class文件对象,就获取哪个注解
参数:注解的class文件对象,可以传递MyAnnotation03.class
使用步骤:
1.定义一个方法,使用自定义注解
2.使用反射技术获取本类的class文件对象
3.使用反射技术获取类中所有的方法
4.遍历包含所有方法的数组,获取每一个方法
5.使用isAnnotationPresent 判断该方法上是否包含传递参数的注解
6.如果方法上包含注解,使用getAnnotation获取方法上的注解
7.使用属性的名字,获取属性值
【类加载器】
把class文件加载到内存中,并生成一个class文件对象
加载器组成
Bootstrap ClassLoader 引导(根)类加载器
也被称为引导类加载器,负责Java核心类的加载
Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载
在JDK中JRE的lib目录下ext目录
AppClassLoader 应用类加载器
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量
所指定的jar包和类路径
自定义的类型:第三方jar包 , 自己定义的类
类加载器的继承关系:
AppClassLoader extends ExtClassLoader extends Bootstrap ClassLoader extends ClassLoader
和类加载器有关的方法:
Class类中的方法:
ClassLoader getClassLoader()返回该类的类加载器
ClassLoader类中的方法:
ClassLoader getParent() 返回委托的父类加载器
【JDK动态代理:只能代理接口】
java.util.Collections集合的工具类
Collections集合的工具类的静态方法
static 返回值:<T>list<T> unmodifiableList(List<? extends T> list)
返回指定列表的不可修改视图
传递一个List集合返回一个被代理的List集合
unmodifiableList方法就是一个代理方法,代理List集合
如果调用size,get方法,没有对集合进行修改,则允许执行
如果调用add,remover,set,对集合进行了修改,则抛出异常不让方法执行
会抛出UnsupportedOperationException:不支持操作异常