<Java笔记02>测试,反射,注解

Junit单元测试

Junit使用方法

步骤

  1. 创建对应的Test文件

  2. 编写测试方法:

  3. 加上@Test 可以独立运行(需要导入Junit依赖环境)

  4. 利用Assert类断言,常用Assert.assertEquals()

补充:在初始化和结束清空内存的方法,可以用@Before 和 @After 在方法名上面声明,测试会在开始和结束的时候分别调用上诉两个方法。

反射

java代码在计算机里会经历三个阶段,源代码阶段(Source),class类对象阶段,(Runtime)运行时阶段。

  • 反射:将类的各个组成部分,封装成各个类对象,便是反射机制。
    • 好处:
      1. 可以在程序运行过程之中,操作这些对象。
      2. 可以解藕

获取Class的三种方法

  1. Class.forName("全类名")
  2. 类名.class()
  3. 利用对象方法,对象.getClass();//Object方法之中定义的

Class对象功能:

  1. 获取成员变量们

    Field[] getFields()//获取public变量
    Field   getField(String name)//获取指定public变更
    Field[] getDeclaredFields()//获取所有变量
    Field   getDeclaredField(String name)//获取变量
    
    
  2. 获取构造方法们getConstructors()

    Constructor constructor= peopleClass.getConstructor(String.class,int.class);//根据对应参数的类对象 获取相应的构造器
    
  3. 获取成员方法们getMethods()

            Method method =  peopleClass.getMethod("eat");//参数是方法名
            Method method2 =  peopleClass.getMethod("eat",int.class);//参数是方法名 后面不定数量的参数是用来
            method.invoke(p);//p是对象
            method2.invoke(p,1);
    
  4. 获取类名 String getName()

具体方法查询API.....

Field类

  1. 获取值

  2. 设置值

  3. 设置权限

    我们通过getDeclaredField获取到私有成员的时候,需要设置其是否可访问从而访问权限修饰符来使用它。

Field f=fields[0];
People p=new People();
f.get(p);//获取值 这个变量是在对象之中,因此参数要传递对象,表示这个对象里的Field值
f.set(p,"1232");//设置值 也是设置在这个对象里的值
f.setAccessible(true);//设置f的权限为可访问

Constructor构造方法对象

  • 作用:用来创建对象
  • newInstance(...参数类型) /
//构造器
Constructor constructor= peopleClass.getConstructor(String.class,int.class);//根据对应参数的类对象 获取相应的构造器
Object object= constructor.newInstance("张三",18);//是利用上面获取的构造器

Constructor constructor1= peopleClass.getConstructor();//根据对应参数的类对象 获取相应的构造器
Object object1 = constructor1.newInstance();//是利用上面获取的构造器

System.out.println(object);
System.out.println(object1);

//空参数的构造方法 可以利用class对象里面创建新的对象 简化操作
peopleClass.newInstance();

Method 方法对象

  • 作用:执行方法

  • 利用invock(对象,参数列表)来执行对应的方法,和上面获取到对应的构造器的相同,都会获取到对应参数列表的方法然后执行,invock是参数是对应的传参

            Method method =  peopleClass.getMethod("eat");//参数是方法名
            Method method2 =  peopleClass.getMethod("eat",int.class);//参数是方法名 后面不定数量的参数是用来区分重载
            method.invoke(p);//p是对象
            method2.invoke(p,1);
    

反射实战分析

  • 需求:写一个“框架”,不改变任何代码的情况下,可以帮我们创建任意类的对象,并执行其中任意的一个方法。

  • 分析:

    1. 通过自身一个类,得到类加载器,用加载器读取配置文件获取其字节输入流
    2. 讲我们字节输入流载入properties里,根据键值,获取我们需要的类名和方法
    3. 通过Class.forName("全类名")获取我们要载入的类,然后通过这个类获取构造器,获取方法,最后创建对象,使用即可。
  • 注意:

    Class.newInstance已经被废除,改用另外一种方法代替

    Class.getDeclaredContructor().newInstance()获取其空参构造函数,利用构造函数的方法newInstance()声明对象。

  • 代码:

    Class  cls= ReflectTestDemo.class;//通过自身的一个类 得到一个类的实例cls
    ClassLoader classLoader = cls.getClassLoader();//通过实例  获取类加载器
    InputStream is = classLoader.getResourceAsStream("pro.properties");//用类加载器得到字节输入流
    
    Properties properties =new Properties();
    properties.load(is);//将字节输入流读入properties里面 分别根据键值得到类名和方法
    
    String className = properties.getProperty("className");
    String methodName = properties.getProperty("methodName");
    
    Class cls2 = Class.forName(className);//加载到Class里面 forName()根据全类名get
    Object obj= cls2.getDeclaredConstructor().newInstance();//1. 获得对象obj
    Method med=cls2.getMethod(methodName);//2.获得方法
    med.invoke(obj);//3.使用方法  (方法要放在对象里面使用
    

注释

**

posted @ 2021-01-29 20:26  Fanxuwei  阅读(68)  评论(0)    收藏  举报