<Java笔记02>测试,反射,注解
Junit单元测试
Junit使用方法
步骤
-
创建对应的Test文件
-
编写测试方法:
-
加上@Test 可以独立运行(需要导入Junit依赖环境)
-
利用Assert类断言,常用
Assert.assertEquals()
补充:在初始化和结束清空内存的方法,可以用@Before 和 @After 在方法名上面声明,测试会在开始和结束的时候分别调用上诉两个方法。
反射

java代码在计算机里会经历三个阶段,源代码阶段(Source),class类对象阶段,(Runtime)运行时阶段。
- 反射:将类的各个组成部分,封装成各个类对象,便是反射机制。
- 好处:
- 可以在程序运行过程之中,操作这些对象。
- 可以解藕
- 好处:
获取Class的三种方法
Class.forName("全类名")类名.class()- 利用对象方法,对象.
getClass();//Object方法之中定义的
Class对象功能:
-
获取成员变量们
Field[] getFields()//获取public变量 Field getField(String name)//获取指定public变更 Field[] getDeclaredFields()//获取所有变量 Field getDeclaredField(String name)//获取变量 -
获取构造方法们
getConstructors()Constructor constructor= peopleClass.getConstructor(String.class,int.class);//根据对应参数的类对象 获取相应的构造器 -
获取成员方法们
getMethods()Method method = peopleClass.getMethod("eat");//参数是方法名 Method method2 = peopleClass.getMethod("eat",int.class);//参数是方法名 后面不定数量的参数是用来 method.invoke(p);//p是对象 method2.invoke(p,1); -
获取类名
String getName()
具体方法查询API.....
Field类
-
获取值
-
设置值
-
设置权限
我们通过
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);
反射实战分析
-
需求:写一个“框架”,不改变任何代码的情况下,可以帮我们创建任意类的对象,并执行其中任意的一个方法。
-
分析:
- 通过自身一个类,得到类加载器,用加载器读取配置文件获取其字节输入流
- 讲我们字节输入流载入properties里,根据键值,获取我们需要的类名和方法
- 通过
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.使用方法 (方法要放在对象里面使用
注释
**

浙公网安备 33010602011771号