测试分类:
a) 定义一个测试类
i. 测试类名:被测试的类名Test FunctionTest
ii. 包名:xxx.xxx.xx.test cn.ycl.test
b) 定义一个测试方法:可以独来运行
i. 方法名:test测试的方法名 testAdd()
ii. 返回值:void
iii. 参数列表:空参
c) 给方法加@Test
d) 导入junit依赖环境
判定结果:
a) 红色:失败
b) 绿色:成功
c) 一般使用断言操作来处理结果:Assert.assertEquals(期望值,实际值);
补充:
a) @before:修饰的方法会在测试方法之前自动被执行
b) @After:修饰的方法会在测试方法之后自动被执行
反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射
好处:
获取class对象的方式:
1.Class.forName(“全类名”):将字节码文件加载进内存,返回class对象
*多用于配置文件,将类名定义在配置文件,读取文件,加载类
2.类名.class.:通过类名的属性class获取
*多用于参数的传递
3.对象.getClass():getClass()方法在Object类中定义着
*多用于对象的获取字节码的方式
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个
Class对象功能:
获取功能:
1.获取成员变量们
a)Field[ ] getFields():获取所有public修饰的成员变量
b)Field getField(String name)
c)Field[ ] getDeclaredFields( ):获取所有的成员变量
i.访问私有变量时,要忽略访问权限修饰符的安全检查
ii. 暴力反射:*.setAccessible(true);
d)Field getDeclaredField(String name)
Field操作:
i.设置值: void set(Object obj, Object value)
ii.获取值:get(Object obj)
2.获取构造方法们
a)Constructor<?>[ ] getConstructors( )
b)Constructor<T> getConstructor(类<?>…parameterTypes)
c)Constructor<?>[ ] getDeclaredConstructors( )
d)Constructor<T> getDeclaredConstructor(类<?>…parameterTypes)
Constructor构造方法:T getDeclaredConstructor().newInstance()
3.获取成员方法们
a)Method[ ] getMethods( )
b)Method getMethod(String name,类<?>…parameterTypes )
c)Method[ ] getDeclaredMethods( )
d)Method getDeclaredMethod(String name,类<?>…parameterTypes )
Method方法对象:
4.获取类名
a)String getName( )
案例:
需求:写一个“框架”,可以帮外面创建任意类对象
代码:
1 package Reflect; 2 3 import java.io.InputStream; 4 import java.lang.reflect.Method; 5 import java.util.Properties; 6 7 public class ReflectTest { 8 public static void main(String[] args) throws Exception { 9 /* 10 * 可以创建任意类的对象,可以执行任意方法 11 * 前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法 12 * */ 13 //1.创建Properties对象 14 Properties pro = new Properties(); 15 //2.加载配置文件,转换为一个集合 16 //3.获取class目录下的配置文件 17 ClassLoader classLoader = ReflectTest.class.getClassLoader(); 18 InputStream is = classLoader.getResourceAsStream("pro.properties"); 19 pro.load(is); 20 //4.获取配置文件中定义的数据 21 String className = pro.getProperty("className"); 22 String methodName = pro.getProperty("methodName"); 23 //5.加载该类进内存 24 Class cls = Class.forName(className); 25 //6.创建对象 26 Object obj = cls.getDeclaredConstructor().newInstance(); 27 //7.获取方法对象 28 Method method = cls.getMethod(methodName); 29 //执行方法 30 method.invoke(obj); 31 32 } 33 } 34 class Person{ 35 private String name = "ycl"; 36 private int age = 21; 37 38 public void info(){ 39 System.out.println("info..."); 40 } 41 42 public Person() { 43 } 44 45 public Person(String name, int age) { 46 this.name = name; 47 this.age = age; 48 } 49 50 public String getName() { 51 return name; 52 } 53 54 public void setName(String name) { 55 this.name = name; 56 } 57 58 public int getAge() { 59 return age; 60 } 61 62 public void setAge(int age) { 63 this.age = age; 64 } 65 } 66 class Student extends Person{ 67 public Student(){ 68 } 69 public Student(String name, int age) { 70 super(name, age); 71 } 72 public void study(){ 73 System.out.println("study...."); 74 } 75 } 76 77 //pro.properties文件 78 className =Reflect.Person 79 methodName = info
异常;
Exception in thread "main" java.lang.NoSuchMethodException: Reflect.Person.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3350)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2554)
at Reflect.ReflectTest.main(ReflectTest.java:26)
原因:缺少无参构造方法
原文:https://www.cnblogs.com/LIAN8/p/11725940.html