注解
1、JDK 1.5之后新特性
2、对元素进行说明(包、类、字段、方法、局部变量,方法参数)
- 注解与注释的区别
- 注解:用特定格式名称说明程序,给计算机看的
-
- 注释: 用文字说明程序,给程序员看的
- 作用分类
- 1、编写文档的注解:生成Apidoc文档(写在注释中)
- 2、代码分析的注解:对代码进行分析(反射)
- 3、编译检查的注解:进行编译检查(@override)
- 注解使用格式
- @注解名称
-
- 编写文档:@since、@author、@version、@param、@return 一般都是JDK内置的,无法自定义
- 编译检查:@override 一般都是JDK内置的,无法自定义
- JDK内置注解
- @override 检查标注的方法是否是父类(接口)的方法
- @Deprecated 标注过时
- @SuppressWarnings 抑制警告提示,一般用法@SuppressWarnings("all")
- 自定义注解 —— 格式
- 元注解
- public @interface 注解名称{
- 属性列表;
- }
- 自定义注解 —— 本质
自定义注解 本质上就是一个接口
,默认继承Annotation接口,所谓属性列表
就是抽象方法
- 自定义注解 —— 属性返回值的数据类型
- 基本数据类型
- String
- 注解
- 枚举
- 以上类型的数组
-
- @MyAnno(value=12,per=Sex.MAN,anno=@person,name="wt")
- 自定义注解 —— 在使用时属性赋值
- 1、定义属性默认值,使用关键字default,使用注解时,可以不用属性赋值
- 2、如果注解中只定义到一个属性,而且属性名为value,则value可以省略
- 3、属性的数据类型为数组时,值使用{}包裹,如果数组中只有一个值,则{}可以省略
- 自定义注解 —— 元注解
- 元注解:用于描述注解的注解,JDK内置
- @Target:描述注解作用的位置
- @Retention: 描述注解被保留到哪个阶段
- @Documented:描述注解是否被提取到api文档中
- @Inherited:描述注解是否被子类继承
- @Target
- ElementType取值:
- TYPE:可以作用于类上
- METHOD:可以作用于方法上
- FIELD:可以作用于成员属性上
- @Retention
- SOURCE:编译检测
- CLASS:注解会保留到class字节码中,不被JVM读取
- RUNTIME:注解会保留到class字节码中,被JVM读取
- 自定义注解 —— 解析
- //不使用注解
- //1、加载配置文件
- //创建Properties对象
- Properties pro = new Properties();
- //加载配置文件,转化为一个流
- //获取classes目录下的配置文件
- ClassLoader classLoader = Person.class.getClassLoader();
- InputStream is = classLoader.getResourceAsStream("pro.properties");
- pro.load(is);
-
- //2、获取配置文件中数据
- String className = pro.getProperty("className");
- String methodName = pro.getProperty("methodName");
- //1、获取字节码文件对象
- Class<Person> p = Person.class;
- Pro an = p.getAnnotation(Pro.class);
- //2、获取配置文件中数据
- String className = an.className();
- String methodName = an.methodName();
- //使用注解
- Person p = new Person();
- //1、获取字节码文件对象
- Class cls = p.getClass();
- //2、获取所有方法
- Method[] methods = cls.getMethods();
- //3、判断方法上是否有注解
- for(Method method : methods){
- if(method.isAnnotationPresent(Check.class)){
- try{
- mothed.invoke(p)
- } catch(Exception e) {
-
- }
- }
- }
泛型
是一种未知的数据类型,当我们定义时不知使用什么数据类型,就可以使用泛型
E e:Element 元素 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
T t:Type 类型 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
集合大量使用泛型
- 作用
- 灵活地将数据类型应用到不同的类、方法、接口中去,将数据类型作为参数进行传递
-
- 对于集合来说
- 1、无需再转数据类型
- 2、运行期的异常提前到编译期
- 3、集合存储数据类型受到限制
- 定义
- // 定义一个含有泛型的类
- public class GenericClass<E> {
- private E name;
-
- public E getName(){
- return this.name;
- }
-
- public void setName(E name){
- this.name = name;
- }
- }
-
- // 定义一个含有泛型的方法
- public static <E> E test(E e){
- return e;
- }
-
- public <E> E test(E e){
- return e;
- }
-
- // 定义一个带有泛型的接口
- public interface GenericClass<E>{
- public abstract void test(E e);
- }
- 使用
使用时才确定数据类型,如果不指定,默认就是Object类型
- // 含有泛型的类使用
- GenericClass<String> gc = new GenericClass<String>();
- String name = gc.getName();
-
- // 含有泛型的方法使用(调用方法的时候才确定数据类型)
- GenericClass.test("123");
-
- // 含有泛型的接口使用(有2种方法)
- 1、继承时确定类型
- public class GernericClassImpl implements GenericClass<String>{
- public String test(String e){
- return e;
- }
- }
-
- 2、创建对象时确定类型
- public class GernericClassImpl<E> implements GenericClass<E>{
- public E test(E e){
- return e;
- }
- }
-
- GernericClassImpl<String> gc = new GernericClassImpl<String>();
- 通配符
通配符<?> (与<E>、<T>要区分)
- 用途:
- 1、不能用于定义类、接口,不能用于创建对象
- 2、只能用于方法传参和方法返回值
- List<String> list1 = new ArrayList<String>();
- List<Boolean> list2 = new ArrayList<Boolean>();
-
- public void test(List<?> list){
- Iterator<?> it = list.iterator();
- while(it.hasNext()){
- Object ob = it.next(); // 由于传入的类型要调用方法才能确定所以获取的都是Object类型
- System.out.println(ob);
- }
- }
-
- public List<?> test(){}
- 高级使用:
- 泛型的上限限定(子类及本身) : <? extends Class>
- 泛型的下限限定(父类及本身) : <? super String>
JUnit单元测试
测试分为黑盒测试
和白盒测试
, JUnit 属于白盒测试
- 以前测试做法
- 创建2个类文件:
- 一个是业务类UserService
- 另一个是业务类对应的测试类UserServiceTest
-
- 测试类UserServiceTest主要使用main方法进行测试,由于一个类中只存在一个main方法,所以如果你要测试多个方法,测试很繁琐
- JUnit单元测试做法
- 步骤:
- 1、定义一个测试类(测试用例)
- 建议:
- 测试类包名(类的包名.test)
- 测试类名(类名+Test)
-
- 2、定义一个测试方法
- 测试方法名(test+被测试的方法名,例如:testAdd)
- 测试方法返回值(void)
- 测试方法传参(空)
-
- 3、给方法增加@Test
- 4、添加预言(建议不要使用打印控制台system.out.println)
- 补充
- @Before : 修饰的方法会在测试方法之前会被自动执行,一般用于资源的申请
- @After : 修饰的方法会在测试方法之后会被自动执行,一般用于资源的释放
枚举
枚举 和 类、接口 同级,其实枚举也是一个类,只是该类的对象给限定了(定义在第一行)
枚举
是JDK1.5
带来的新特性
- 作用
让一个类的对象是有限且固定,例如性别:不是男就是女
- 定义枚举
- public enum Sex{
- MALE,FEMALE;
- }
-
- public enum Sex {
- MALE("男"),FEMALE("女");
-
- private final String name;
-
- private Sex(String name){
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
- }