day24学习总结
一、Junit
简介:
Junit 是用来做局部测试的 局部测试可以快速找到bug
测试分类:
黑盒测试:
功能测试,按照需求来测试具体的功能 难度小
白盒测试:
测试开发工程师(测开), 编写自动化脚本代码 java或Python 难度较大
Junit使用步骤:
1.导入Junit的jar包
2.定义一个类
3.在类中定义一个无返回值无参的方法
4.在方法上加上注解@Test
jar包下载地址:/ 需翻墙
测试代码:
package com.qf.test.test01;import org.junit.Test;public class Test01 {@Testpublic void showInfo(){System.out.println("将军金甲夜不脱");}
}
二、定时器
简介:
开发中使用到定时器的场景:A.定时发送邮件 B.定时任务 C.定时更新文件中内容
使用步骤:
1.定义一个类 继承 TimerTask类
2.实例化实现类任务对象
3.实例化Timer对象
4.将任务对象提交到定时器对象中
定时器的概念:
定时器是一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次或者定期重复执行
每个 Timer 对象相对应的是单个后台线程
所有构造方法都启动计时器线程
常用的方法:
测试代码:
任务类
package com.qf.test.test02;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.TimerTask;public class MyTimerTask extends TimerTask {@Overridepublic void run() {try {Writer w = new FileWriter("1.txt",true);w.write("班长去洗脚");w.close();} catch (IOException e) {e.printStackTrace();}}
}
测试类:
package com.qf.test.test02;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;public class Test {public static void main(String[] args) throws ParseException {//实例化任务类MyTimerTask t = new MyTimerTask();//实例化定时器类Timer timer = new Timer();Scanner input = new Scanner(System.in);System.out.println("请输入一个时间");String line =input.nextLine();Date date=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(line);timer.schedule(t,date,10000);try {Thread.sleep(60000);} catch (InterruptedException e) {e.printStackTrace();}timer.cancel();}
}
三、反射
简介:
1.大部分框架都会使用反射,反射是框架的灵魂 在java中所有的资源在反射面前都是裸体
2.框架: 框架就是类似一个半成品 使用框架开发 成本低 周期短 省成本
3.java就业::大数据与分布式框架
分布式框架:
a. ssm(spring+ spring mvc + mybatis) +dobbo
b. springboot + mybatisplus +dobbo(重点)
c. springboot+springcloud(重点)
4. 反射机制:将类的各个部分组成为一个新对象(Class对象)
获取Class对象的三种方式:
A.调用对象的.getClass()方法
public final Class getClass() 返回此 Object 的运行时类
B.通过类名.Class获取
Student.Class
C.通过完整的包名+类名来获取(重点)
public static Class forName(String className)
package com.qf.test04;
import org.junit.Test;
public class Test01 {@Testpublic void showInfo01() throws ClassNotFoundException {//第一种方式获取Class studentClass = Student.class;System.out.println(studentClass);//第二种方式Student stu= new Student();Class aClass = stu.getClass();System.out.println(aClass);//第三种方式Class cla = Class.forName("com.qf.test04.Student");System.out.println(cla);}
}
获取类对象的构造方法的方法:
测试代码:
学生类
package com.qf.test.test03;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}private Student(String name){System.out.println(name);}public int show(int num1,int num2){return num1+num2;}public String show2(String s){return s;}private void show3(){System.out.println("按摩");}
}
测试类:
package com.qf.test.test03;import org.junit.Test;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class Test01 {/*** 获取所有公有的构造方法* @throws ClassNotFoundException*/@Testpublic void shouInfo() throws ClassNotFoundException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取所有的公有的构造方法Constructor<?>[] constructors = name.getConstructors();//循环遍历for (Constructor con : constructors){System.out.println(con);}}/*** 获取所有的构造方法 包括公有和私有* @throws ClassNotFoundException*/@Testpublic void shouInfo02() throws ClassNotFoundException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取所有的的构造方法,包括私有和公有Constructor<?>[] declaredConstructors = name.getDeclaredConstructors();//循环遍历for (Constructor con : declaredConstructors){System.out.println(con);}}/*** 获取单个公有构造方法 并实例化对象 调用公有的方法* @throws ClassNotFoundException* @throws IllegalAccessException* @throws InvocationTargetException* @throws InstantiationException* @throws NoSuchMethodException*/@Testpublic void shouInfo03() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取单个公有的构造方法Constructor<?> constructor = name.getConstructor();//实例化对象Student s = (Student)constructor.newInstance();int a = s.show(1,2);System.out.println(a);}/*** 获取单个私有的构造方法 并实例化对象 调用公有的方法* @throws ClassNotFoundException* @throws NoSuchMethodException* @throws IllegalAccessException* @throws InvocationTargetException* @throws InstantiationException*/@Testpublic void shouInfo04() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取单个私有的构造方法 构造方法中需要传入参数 就得写 参数的类对象Constructor<?> declaredConstructor = name.getDeclaredConstructor(String.class, int.class);//使用反射暴力去除私有declaredConstructor.setAccessible(true);//实例化对象Student s = (Student)declaredConstructor.newInstance("班长", 21);//调用方法String ss =s.show2("洗脚");System.out.println(ss);}}
获取类对象的成员方法的方法:
测试代码:
@Testpublic void show() throws ClassNotFoundException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取所有公有的成员方法 包括父类的成员方法Method[] methods = name.getMethods();//循环遍历for (Method m :methods){System.out.println(m);}}@Testpublic void show2() throws ClassNotFoundException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取所有的成员方法 包括私有的成员方法Method[] declaredMethods = name.getDeclaredMethods();//循环遍历for (Method m : declaredMethods){System.out.println(m);}}@Testpublic void show3() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取单个公有的成员方法Method show2 = name.getMethod("show2", String.class);//获取构造方法Constructor<?> constructor = name.getConstructor();//实例化对象Object o = constructor.newInstance();//调用用方法Object s = show2.invoke(o, "班长洗脚");System.out.println(s);}@Testpublic void show4() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {//获取Class对象Class<?> name = Class.forName("com.qf.test.test03.Student");//获取单个私有的成员方法Method show3 = name.getDeclaredMethod("show3");//使用暴力反射去取私有show3.setAccessible(true);//获取构造方法Constructor<?> constructor = name.getConstructor();//实例化对象Object o = constructor.newInstance();//调用方法show3.invoke(o);}
四、案例(易)
需求:使用反射忽略集合泛型
分析:
代码:
package com.qf.test.test04;import org.junit.Test;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class Test01 {@Testpublic void show() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {List<String > li = new ArrayList<>();li.add("班长");li.add("去按摩");System.out.println(li);//获取Class对象Class liClass = li.getClass();//获取单个方法Method method = liClass.getMethod("add", Object.class);//调用方法method.invoke(li,12);System.out.println(li);}
}
五、案例(难)
需求:在不改变任何java代码的前提 调用一个类中任意的方法
分析:
代码:
配置文件:
className=com.qf.test.test05.Person
methodName=show2
kind=String,int,String
result=banzhang,21,anmo
工具类:
package com.qf.test.test05;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public enum PropertiesUtils {PROPERTIES_UTILS;private Properties pro;PropertiesUtils(){try {//加载配置文件InputStream is = PropertiesUtils.class.getResourceAsStream("1.properties");//实例化Properties对象pro = new Properties();//将数据从文件中读取pro.load(is);} catch (IOException e) {e.printStackTrace();}}//获取值的方法public String getValue(String key){return pro.getProperty(key);}
}
Person类:
package com.qf.test.test05;public class Person {private String name;private int age;private String hobby;public Person() {}public Person(String name, int age, String hobby) {this.name = name;this.age = age;this.hobby = hobby;}public void show1(){System.out.println("班长洗脚");}public void show2(String name,int age,String paly){System.out.println(name+"\t"+age+"\t"+paly);}private void show3(){System.out.println("班长按摩");}private void show4(String name,int age){System.out.println(name+"\t"+age);}
}
测试类:
package com.qf.test.test05;import org.junit.Test;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;public class Test01 {@Testpublic void show() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException, ClassNotFoundException {//获取完整包名+类名String className = PropertiesUtils.PROPERTIES_UTILS.getValue("className");//获取方法名String methodName = PropertiesUtils.PROPERTIES_UTILS.getValue("methodName");//获取参数数据类型String kind = PropertiesUtils.PROPERTIES_UTILS.getValue("kind");//获取具体参数String result = PropertiesUtils.PROPERTIES_UTILS.getValue("result");//获取Class对象Class<?> name = Class.forName(className);//创建一个对象Object o = name.newInstance();//获取参数类型Class[] classes = getKind(kind);//获取参数值Object[] reuslt = getReuslt(kind, result);//获取方法Method m = null;//如果方法没有参数if (classes==null){//获取方法m = name.getMethod(methodName);//调用方法m.invoke(o);}else {//获取方法m = name.getMethod(methodName,classes);//调用方法m.invoke(o,reuslt);}}//获取方法参数类型public Class[] getKind(String s){//验证参数类型是否为空if (s==null||s.equals("")){//返回空return null;}//若不为空//以逗号分隔String[] s1 = s.split(",");List<Class> list = new ArrayList<>();for (String s2 :s1){if (s2.equals("String")){list.add(String.class);}else if (s2.equals("int")){list.add(int.class);}else {list.add(Object.class);}}//将集合转换为数组return list.toArray(new Class[list.size()]);}//获取方法参数具体值public Object[] getReuslt(String s,String s1){//验证参数是否为空if (s==null||s.equals("")||s1==null||s1.equals("")){//返回空return null;}//若不为空//以逗号进行分隔String[] split = s.split(",");String[] split1 = s1.split(",");//实例化一个集合存储参数List<Object> list = new ArrayList<>();for (int i=0;i<split.length;i++){if (split[i].equals("String")){list.add(split1[i]);}else if (split[i].equals("int")){list.add(Integer.parseInt(split1[i]));}else {list.add((Object) split1[i]);}}return list.toArray(new Object[list.size()]);}
}
更多推荐
day24学习总结
发布评论