A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 穆浩伟 初级黑马   /  2019-5-19 10:12  /  859 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2019-5-23 16:47 编辑

课堂知识点

一、反射

1.基本概念

- 在程序运行过程中,动态的获取一个类的成员(成员变量、构造方法、成员方法)并使用
- 作用:反射被称为框架技术的灵魂

2.获取Class对象三种方式

- 类名.class
- 对象名.getClass()
- Class.forName(全类名)

3.程序的执行经历流程



4.反射案例

- 老师类

   
[AppleScript] 纯文本查看 复制代码
 public class Teacher {
        public void teach() {
            System.out.println("老师讲课");
        }
    }


- 学生类

   
[AppleScript] 纯文本查看 复制代码
 public class Student {
        public void study() {
            System.out.println("学生学习");
        }
    }


- 测试类

    /*
        框架功能:
            不改动当前类中的代码,还能去创建不同类的对象,调用不同的方法
   
[AppleScript] 纯文本查看 复制代码
  */
    public class Test02 {
        public static void main(String[] args) throws Exception{
            /*Student stu = new Student();
            stu.study();
    
            Teacher t = new Teacher();
            t.teach();*/
    
            Properties prop = new Properties();
            InputStream is = Test02.class.getClassLoader().getResourceAsStream("test.properties");
            prop.load(is);
    
            String className = prop.getProperty("className");
            String methodName = prop.getProperty("methodName");
    
    
            //通过反射技术,来使用老师类中的teach方法
            Class cls = Class.forName(className);
            Object obj = cls.newInstance();
    
            Method method = cls.getMethod(methodName);
    
            method.invoke(obj);
        }
    }


- 配置文件

    #className=com.itheima01.Student
    #methodName=study
   
    className=com.itheima01.Teacher
    methodName=teach

二、Junit

1.测试分类

- 黑盒测试:傻瓜式测试。只关心结果!
- 白盒测试:更有技术含量。除了关心结果,还要关心程序的安全性和健壮性

2.Junit基本使用

- 在方法声明上,加上@Test注解
- 示例代码

   
[AppleScript] 纯文本查看 复制代码
 public class Calculator {
    
        /**
         * 加法
         * @param a
         * @param b
         * @return
         */
        public int add (int a , int b){
            //int i = 3/0;
            return a - b;
        }
    
        /**
         * 减法
         * @param a
         * @param b
         * @return
         */
        public int sub (int a , int b){
            return a - b;
        }
    
    }

    public class CalculatorTest {
        /**
         * 初始化方法:
         *  用于资源申请,所有测试方法在执行之前都会先执行该方法
         */
        @Before
        public void init(){
            System.out.println("init...");
        }
    
        /**
         * 释放资源方法:
         *  在所有测试方法执行完后,都会自动执行该方法
         */
        @After
        public void close(){
            System.out.println("close...");
        }
    
        /**
         * 测试add方法
         */
        @Test
        public void testAdd(){
            //1.创建计算器对象
            System.out.println("testAdd...");
            Calculator c  = new Calculator();
            //2.调用add方法
            int result = c.add(1, 2);
            //3.断言  我断言这个结果是3
            Assert.assertEquals(3,result);
        }
    
        @Test
        public void testSub(){
            //1.创建计算器对象
            Calculator c  = new Calculator();
            int result = c.sub(1, 2);
            System.out.println("testSub....");
            Assert.assertEquals(-1,result);
        }
    }


3.单元测试需要使用的注解

- @Before    执行功能方法之前被执行
- @Test         执行功能方法
- @After       执行功能方法之后被执行

三、注解

1.注解概念

- 注解就是用于说明程序的。参与程序的运行
- JDK1.5版本之后的新特性

2.注解的作用

- 编写文档(API帮助文档)
- 编译检查(@Override   @FunctionalInterface)
- 代码分析(配合反射使用)【重点】

3.常用的注解

- @Override     用于检测方法是否是重写的
- @Deprecated    用于标识某个方法是否已过时
- @SuppressWarnings    用于压制警告
- @FunctionalInterface    用于检测接口是否是一个函数式接口
- @Before      在功能方法之前被执行
- @Test           执行功能方法
- @After         在功能方法之后被执行

4.自定义注解

- 格式

    public @interface 注解名称{
        
    }

- 本质
  - 注解本质就是一个接口!所有的注解都实现了Annotation接口
- 注解中的属性
  - 属性(方法)的返回值数据类型
    - 基本数据类型四类八种
    - String
    - 枚举
    - 注解
    - 以上数据类型的数组
  - 注意事项
    - 可以使用default给属性设置一个默认初始化值
    - 如果属性名叫value,而且只有一个属性时,那么赋值时,属性名可以省略
    - 数组进行赋值时,需要使用{}。如果数组中只有一个值,{}可以省略
- 元注解
  - @Target(ElementType)
    - TYPE   用于类上面
    - METHOD  用于方法上面
    - FIELD     用于变量上面
  - @Retention(RetentionPolicy)
    - SOURCE   源代码阶段
    - CLASS      字节码阶段
    - RUNTIME  运行时阶段
  - @Documented     可以被抽取到帮助文档中
  - @Inherited            可以被子类继承

5.解析注解

- 狗类

   
[AppleScript] 纯文本查看 复制代码
public class Dog {
        public void eat() {
            System.out.println("狗吃肉");
        }
    }


- 猫类

   
[AppleScript] 纯文本查看 复制代码
public class Cat {
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }

   

- 注解

   
[AppleScript] 纯文本查看 复制代码
 @Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnimalAnnotation {
        String className();   // 记录 全类名
        String methodName();  // 记录 方法名
    }

   

- 测试类

  
[AppleScript] 纯文本查看 复制代码
  @AnimalAnnotation(className = "com.itheima01.Cat",methodName = "eat")
    public class Test06 {
        public static void main(String[] args) throws Exception{
            //获取注解中的属性值
            //1.获取Test06类的Class对象
            Class<Test06> cls = Test06.class;
            //2.通过Class对象来获取注解对象
            AnimalAnnotation animal = cls.getAnnotation(AnimalAnnotation.class);
            //3.通过注解对象调用属性。来获取属性值
            String className = animal.className();
            String methodName = animal.methodName();
    
    
            //通过反射来调用方法
            //1.获取Class对象
            Class cls2 = Class.forName(className);
            //2.获取方法
            Method method = cls2.getMethod(methodName);
            //3.执行方法
            method.invoke(cls2.newInstance());
        }
    }

   

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马