java之测试、反射和注解

若如初见. 提交于 2020-01-19 05:22:34

一、测试

测试分类:

黑盒测试:不需要写代码,给输入值,看程序是否能输出期望值

白盒测试:写代码测试,关注程序具体执行流程

Junit:白盒测试

1.定义一个测试类

2.定义测试方法:可以独立运行

3.给方法添加@Test注解

4.导入Junit依赖环境

判定结果:红色代表失败,绿色代表成功

补充:(无论运行结果是正确还是错误,被修饰的方法都会执行)

        @Before:修饰分方法会在测试方法执行之前被自动执行

        @After:修饰的方法会在测试方法执行之后自动执行

public class CalculateTest {

    @Test
    public void testAdd(){
        Calculate c = new Calculate();
        System.out.println("calculate...");
        int result = c.add(1,2);
        //断言,我断言这个结果是三
//        Assert.assertEquals(2,result);
        Assert.assertEquals(3,result);
    }

    //初始化方法,用于资源的申请
    @Before
    public void init(){
        System.out.println("init...");
    }

    //结束方法,用于资源的释放
    @After
    public void close(){
        System.out.println("end...");
    }
}

二、反射:框架设计的灵魂

              框架:半成品软件,可以在框架的基础上进行软件开发,简化编码

              反射:将类的各个组成部分封装为其他对象,这就是反射机制

              获取Class对象的方法:

              1. Class.forName("全类名”): 将字节码文件加载进内场,返回Class对象

                    多用于配置文件,读取文件,加载类

              2. 类名.class: 通过类名的属性class获取

                    多用于参数传递

              3. 对象.getClass(): getClass() 方法在Object类中定义着

                    多用于对象的获取字节码的方式

Class cls1 = Class.forName("cn.xmz.pr2001.pr11.reflect.Person");
        System.out.println(cls1);

        //2. 类名.class: 通过类名的属性class获取
        Class cls2 = Person.class;
        System.out.println(cls2);

        //  3. 对象.getClass(): getClass() 方法在Object类中定义着
        Class cls3 = new Person().getClass();
        System.out.println(cls3);

使用Class对象(功能):

         获取功能: 获取成员变量,构造方法,成员方法类名(具体参看文档Class)

public class ReflectTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//        Person person = new Person();
//        person.eat();
        Properties pro = new Properties();
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);

        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        Class cls = Class.forName(className);
        Object obj = cls.newInstance();
        Method method = cls.getMethod(methodName);

        method.invoke(obj);
    }
}

注解(说明程序,给程序员看的):

作用分类:

           1. 编写文档:通过代码里的标识的元数据生成文档(生成文档doc文档)

           2. 代码分析:对代码进行分析(使用反射)

           3. 让编译器能实现基本的编译检查【override】

JDK中预定义的一些注解:

             Override(检查是否是继承是实现接口)

             Deprecated(标注的内容表示已过时)

             SuppressWarnings(“all”):压制警告

自定义注解:本质是一个接口,默认继承Annotation接口

          格式:元注解--》描述注解的注解

                    public  @interface  注解名{}

          属性:接口可以定义的抽象方法

                  要求:返回值类型(基本数据类型,string,枚举,注解,以上类型的数组)

                             定义了属性在使用时要赋值

         元注解:@Target(描述注解能作用的位置)

                  ElementType取值:

                            1.TYPE可以作用于类上

                            2.METHOD可以作用于方法上

                            3.FIELD可以作用于成员变量上

@Target(value={ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})

                       @Retention(描述注解被保留的阶段)

@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到

                       @Documented(描述注解是否被抽取到api文档中)

                       @Inherited(描述注解是否被子类继承)

在程序使用(解析)注解:获取注解定义的属性值

                1. 获取注解定义的位置的对象(Class,Method,Field)

                2. 获取指定的注解     getAnnotation(Class)

                3. 调用注解中的抽象方法获取配置的属性

 Class<ReflectTestAnno> reflectTestClass = ReflectTestAnno.class;

        Pro an = reflectTestClass.getAnnotation(Pro.class);
        String className = an.className();
        String methodName = an.methodName();
        System.out.println(className);
        System.out.println(methodName);

        Class cls = Class.forName(className);
        Object obj = cls.newInstance();
        Method method = cls.getMethod(methodName);
        method.invoke(obj);

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!