学习Java二十四天

本文介绍了Java开发中的测试工具Junit,详细讲解了如何进行黑盒测试与白盒测试,并展示了Junit的使用步骤。接着,文章探讨了定时器的使用,包括定时任务的实现和相关方法。最后,深入解析了Java反射机制,阐述了获取Class对象、构造方法和成员方法的方式,并通过案例展示了反射在实际问题中的应用。
摘要由CSDN通过智能技术生成

一、Junit

1.1简介

1、Junit 用于来坐局部测试 局部测试可以方便快速查找bug

2、测试分类:黑盒测试与白盒测试

3、黑盒测试:功能测试 瞎点:按照需求来测试具体的功能 比较简单(基础测试)

4、白盒测试:测试开发工程师(测开)编写自动化脚本代码 java与python 难度比较大

5、Junit使用步骤

A、定义一个类

a、在类中定义一个方法 b、方法没有返回值 方法没有参数

B、在方法加上一个注解 @Test

6、jar下载

https://mvnrepository.com/artifact/junit/junit

1.2使用步骤

step01新建一个lib文件

step02lib文件夹创建成功

step03 copy jar到 lib目录下

step04添加依赖

二、定时器

2.1简介

1、生活中的定时器 闹钟……

2、开发中使用定时器场景:A、定时发送邮件 B、定时任务 C、定时更新文件中的内容

3、使用步骤

A、定义一个类 继承Timer Task(Runnable)任务

B、创建定时器类 Timer

C、将任务提交到定时器中

2.2定时器类

1、概念:

A、一种工具,

B、

C、

2.3常用的方法

方法的名称

方法的描述

public void schedule(TimerTask task,Date time)

(第一个参数是任务,第二个是执行任务的时间)安排在指定的时间执行指定的任务,如果此时间已过去则安排立即执行该任务

public void schedule(TimerTask task,Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行(间隔多长时间多次执行任务)

public void schedule(TimerTask task,long delay)

安排在指定延迟后执行指定的任务

public void schedule(TimerTask task,long delay, long period)

安排只当的任务从指定时间的延迟后开始进行重复的固定延迟执行

public void cancel()

终止此计时器,丢弃所有当前已安排的任务

代码-

package com.gkd.test02; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.util.TimerTask; public class MyTimerTask extends TimerTask { @Override public void run() { try { //向文件写入内容 BufferedWriter bw=new BufferedWriter(new FileWriter("3.txt",true)); bw.write("老王"); bw.close(); } catch (IOException e) { e.printStackTrace(); } } }

代码-测试类

package com.gkd.test02; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; import java.util.Timer; public class Test01 { public static void main(String[] args) throws ParseException { //实例化任务对象 MyTimerTask task=new MyTimerTask(); //实例化定时器类 Timer t=new Timer(); //输入一个时间 Scanner input= new Scanner(System.in); System.out.println("请输入一定时启动时间:"); String line =input.nextLine(); Date p = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(line); //将任务提交到定时器中 // t.schedule(task,p); t.schedule(task,p,1000); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } t.cancel(); } }

三、反射

3.1简介

1、大部分框架都是用反射 反射是框架的灵魂 在Java中 所有的资源在反射面前都是裸体(所有资源都可以通过反射获取)

2、框架:是一个半成品 大部分公司都提供使用框架 使用框架开发 成本低 周期短 省成本

3、Java就业:两个方向 大数据方向与分布式框架

分布式框架:三套

a、ssm(spring +springMVC +mybatis)+dobbo

b、springboot+mybatisplus+dobbo(重点)

c、springboot+springcloud(重点)

4、反射机制:将类的各个部分组成一个新的对象(Class对象)

3.2获取Class对象

A、第一种方式

调用对象的getClass()

public final Class getClass() 返回此 Object 的运行时类

B、第二种方式

通过类名点Class获取

Student.class

C、第三种方式

通过完整的包名点类名来获取(最多使用)

public static Class forName(String className)

代码

3.3获取构造方法

方法的名称

方法的描述

public Constructor[] getConstructors()

获取所有公有的构造方法

public Constructor[] getDeclaredConstructors()

获取所有私有的构造方法(包括公有的构造方法)

public Constructor getConstructor(Class...parameterTypes)

获取单个公有的构造方法

public Constructor getDeclaredConstructor(Class...parameterTypes)

获取单个私有的构造方法

代码-学生类

package com.gkd.test03; public class Student { private String name; public int age; public Student(){ } private Student(String name){ System.out.println(name); } public void showInfo(String s){ System.out.println(s); } private int getSum(int num1,int num2){ return num1+num2; } }

代码-测试类-获取所有公有的构造方法

/** * 获取所有的公有的构造方法 * @throws ClassNotFoundException */ @Test public void showInfo() throws ClassNotFoundException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取所有的公有的构造方法 Constructor[] con = cla.getConstructors(); //使用循环遍历数组 for (Constructor c:con){ System.out.println(c); } }

代码-测试类-获取所有的构造方法(包括私有)

/** * 获取所有的私有的构造方法 * @throws ClassNotFoundException */ @Test public void showInfo2() throws ClassNotFoundException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取所有的私有的构造方法 Constructor[] con = cla.getDeclaredConstructors(); //使用循环遍历数组 for (Constructor c:con){ System.out.println(c); } }

代码-测试类-获取单个公有的构造方法

/** * 获取单个公有的构造方法 * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo3() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取单个公有的构造方法 Constructor con = cla.getConstructor(); //实例化对象 Student stu = (Student) con.newInstance(); stu.showInfo("hhhh"); }

代码-测试类-获取单个私有的构造方法

/** * 获取单个私有的构造方法 * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo4() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取单个私有的构造方法 Constructor con = cla.getDeclaredConstructor(String.class); //使用暴力反射去除私有 con.setAccessible(true); //实例化对象 Student stu = (Student) con.newInstance("老王"); stu.showInfo("去按摩"); }

3.4获取成员方法

方法的名称

方法的描述

public Method[] getMethods()

获取所有公有的成员方法(包括父类的公有成员方法)

public Method[] getDeclaredMethods()

获取所有的方法(包括私有)

public Method getMethod(String name, Class...parameterTypes)

获取单个公有的成员方法

public Method getDeclaredMethod(String name,Class... parameterTypes)

获取单个私有的成员方法

代码-获取所有公有的成员方法

/** * 获取所有的公有的成员方法 * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo5() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取所有的公有的成员方法 Method[] me = cla.getMethods(); for (Method m:me){ System.out.println(m); } }

代码-测试类-获取所有的私有成员方法

/** * 获取所有的的成员方法(包括私有) * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo6() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取所有的的成员方法(包括私有) Method[] me = cla.getDeclaredMethods(); for (Method m:me){ System.out.println(m); } }

代码-测试类-获取单个公有的成员方法

/** * 获取单个公有的成员方法 * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo7() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取单个公有的成员方法 Method clam = cla.getMethod("showInfo", String.class); //获取构造方法 Constructor con = cla.getConstructor(); //实例化对象的 Object o = con.newInstance(); //调用方法 第一参数是需要调用方法的对象,第二个是参数数据 clam.invoke(o,"凤舞"); }

代码-测试类-获取单个私有的成员方法

/** * 获取单个私有的成员方法 * @throws ClassNotFoundException * @throws InvocationTargetException * @throws InstantiationException * @throws IllegalAccessException * @throws NoSuchMethodException */ @Test public void showInfo8() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException { //获取Class对象 Class cla = Class.forName("com.gkd.test03.Student"); //调用方法获取单个私有的成员方法 Method clam = cla.getDeclaredMethod("getSum", int.class, int.class); //使用暴力反射去除私有 clam.setAccessible(true); //获取构造方法 Constructor con = cla.getConstructor(); //实例化对象的 Object o = con.newInstance(); //调用方法 第一参数是需要调用方法的对象,第二个是参数数据 Object o1= clam.invoke(o, 10, 90); System.out.println(o1); }

3.5案例

step01需求 使用反射忽略集合泛型

step02分析

A、实例化

B、

C、通过反射来获取方法

class.getMe("add",Object.Class)

3.6案例

step01需求 在不改变任何Java代码的前提 使用反射获取一个类种任意的方法

配置文件

className=com.gkd.test04.Student methodName=show pratype=String,int,String result=add,18,kk

step01代码-工具类

package com.gkd.test04; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertiesUtil { //私有化属性 private static PropertiesUtil propertiesUtil; private Properties pro; //私有化构造方法 private PropertiesUtil(){ try { //在构造方法里面访问配置文件 pro=new Properties(); //加载配置文件 // InputStream is = new FileInputStream("admin.properties"); //使用反射加载配置文件 InputStream is = PropertiesUtil.class.getResourceAsStream("admin.properties"); pro.load(is); } catch (IOException e) { e.printStackTrace(); } } //向外提供一个访问的方法 public static synchronized PropertiesUtil getInstance(){ if (propertiesUtil==null){ propertiesUtil=new PropertiesUtil(); } return propertiesUtil; } //向外提供一个方法 通过键访问值 public String getValue(String key){ return pro.getProperty(key); } }

step03代码-学生类

package com.gkd.test04; public class Student { public void showInfo(){ System.out.println("老王今天到账一百万元,然后晚上去按摩花光了"); } public void show(String name,int age,String hobby){ System.out.println(name+"\t"+age+"\t"+hobby); } }

step04代码-测试类

package com.gkd.test04; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Test01 { //showInfo方法 @Test public void showInfo01() throws InvocationTargetException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InstantiationException { String className = PropertiesUtil.getInstance().getValue("className"); String methodName = PropertiesUtil.getInstance().getValue("methodName"); String pratype = PropertiesUtil.getInstance().getValue("pratype"); String result = PropertiesUtil.getInstance().getValue("result"); //获取Class对象 Class cla = Class.forName(className); //获取方法名称 Method me = cla.getDeclaredMethod(methodName); //实例化对象 Object o = cla.newInstance(); //调用方法 me.invoke(o); } //show方法 @Test public void showInfo02() throws InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException, ClassNotFoundException { String className = PropertiesUtil.getInstance().getValue("className"); String methodName = PropertiesUtil.getInstance().getValue("methodName"); String pratype = PropertiesUtil.getInstance().getValue("pratype"); String result = PropertiesUtil.getInstance().getValue("result"); //获取class对象 Class<?> cla = Class.forName(className); //获取参数 Class[] praName = getClassName(pratype); Method method = cla.getDeclaredMethod(methodName, praName); //实例化对象 Object o = cla.newInstance(); //调用方法 method.invoke(o,getClassName(pratype,result)); } @Test //任意的方法 public void showInfo03() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException, ClassNotFoundException { String className = PropertiesUtil.getInstance().getValue("className"); String methodName = PropertiesUtil.getInstance().getValue("methodName"); String pratype = PropertiesUtil.getInstance().getValue("pratype"); String result = PropertiesUtil.getInstance().getValue("result"); //获取class对象 Class<?> cla = Class.forName(className); //获取参数的数据类型 Class[] classArrays = getClassName(pratype); //获取构造方法 Constructor<?> con = cla.getConstructor(); //实例化对象 Object o = con.newInstance(); Method m=null; //获取方法名称并调用方法 if(classArrays==null){ Method m1 = cla.getMethod(methodName); m1.invoke(o); }else { Method m2 = cla.getMethod(methodName, classArrays); m2.invoke(o,getClassName(pratype,result)); } } /** * 获取数据的参数类型 * @param s * @return */ public Class[] getClassName(String s){ if (s==null||"".equals(s)){ return null; } //对字符串进行拆分 String[] split = s.split(","); //实例化集合来进行存储,因为集合的长度是变的 List<Class> list=new ArrayList<>(); //使用循环遍历数组存入集合 for (String s1:split){ if (s1.equals("String")){ //存入一个对象.class list.add(String.class); }else if (s1.equals("int")){ list.add(int.class); }else { list.add(Object.class); } } //最后返回一个数组 return list.toArray(new Class[list.size()]); } /** * 获取有参数的具体数据 * @param s * @param result * @return */ public Object[] getClassName(String s,String result){ if (s==null||"".equals(s)||result==null||"".equals(result)){ return null; } //对字符串进行拆分 String[] s1 = s.split(","); String[] re = result.split(","); //定义集合来存储 List<Object> list=new ArrayList<>(); //使用普通for循环 for (int i=0;i<s1.length;i++){ if (s1[i].equals("String")){ list.add(re[i]); }else if (s1[i].equals("int")){ list.add(Integer.parseInt(re[i])); }else { list.add(Object.class); } } //将结合转换为数组 return list.toArray(new Object[list.size()]); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值