当前位置: 首页 > ai >正文

卷java,继承三

一、Junit 单元测试 

写法和运行

第一次用Jnit要下载(选4)、和导入

运行

  •         如果点到类上,右键又可以全部运行,或者点某个小三角来运行
  •         甚至到 module 、项目上,右键运行,会运行所有满足的test方法(规则如下)

修复上面的方法、加一个非空判断。 

    public static void printLength(String str){if(str ==null){System.out.println("参数不能为null");return;}System.out.println(str.length());}

小技巧:用例失败,一键点击问 lingma

 遇到问题了,可以把报错和代码发给ai, 点击下方,可以直接问

 断言和命别名的写法

 Junit的注解(Junit4 版本)

注:写@Before  时, 不加static

写@BeforeClass 和 @AfterClass 时, 定义方法时加  static

Junit5版本注解

名字改了,5还新增了一个叫 

 @DisplayNam("测试用例名字")

二、反射(Reflection)-(外部开挂可以去操作一个类的私有)

反射相当于就是通过运行,可以去查一个类的信息,好比编译器知道一个类有哪些方法一样

 反射: 就是剖析一个类(deepseek简单例子。)

import java.lang.reflect.*;
public class ReflectionDemo {public static void main(String[] args) throws Exception {// 获取String类的Class对象  (反射:通过类名找到这个类)Class<?> clazz = Class.forName("java.lang.String");// 获取类名System.out.println("类名: " + clazz.getName());   // java.lang.String// 获取所有公共方法(只看方法名)System.out.println("\n公共方法:");Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method.getName());}}
}

1 、获取class对象,有三种方式

2、 用1的对象,可以接着获取 类的构造器 (全部、某个)

  • 可以知一个构造器有几个参数、名字
  •  根据某个又可以继续去创建类,甚至私有的构造器这里还能创建类

3、 用1 的对象,可以接着获取类中的 成员变量(全部、某个)

  • 可以知某个的名字、类型
  • 可以给某个成员变量设置值(私有也能去获取)、获取值

4、用1 的对象获取类中的 成员方法(全部、某个)

  • 可以调用某个方法

Student.java

package com.taoke.d2;public class Student {private String name;private int age;public Student() {}private Student(String name, int age) {this.name = name;this.age = age;}public void show(){System.out.println("我是一个方法");System.out.println(name + " " + age);}public void show(int xxx){System.out.println("我是一个有参方法");}
}
StudentTest.java
package com.taoke.d2;import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class StudentTest {@Test@DisplayName("测试获取全部构造器")public void test1() throws ClassNotFoundException {Class clazz = Student.class;
//        System.out.println(clazz);      // class com.taoke.d2.Student// 2. 获取类方式2 (用这个的话,需要方法 throws Exception)Class clazz2 = Class.forName("com.taoke.d2.Student");
//        System.out.println(clazz2);// 3.获取方式3Student student = new Student();Class clazz3 = student.getClass();
//        System.out.println(clazz3);}@Test@DisplayName("测试获取全部构造器")public void test2()   {Class clazz = Student.class;
//        Constructor<?>[] constructors = clazz.getConstructors();  // 仅public的Constructor<?>[] constructors = clazz.getDeclaredConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor.getName() +"---参数个数->" + constructor.getParameterCount());}}@Test@DisplayName("获取某个构造器")public void test3() throws Exception {Class clazz = Student.class;// 1. 就建议用getDeclaredConstructor了,私有也查// 2. 获取午参构造器的写法
//        Constructor<?> constructor1 = clazz.getDeclaredConstructor();Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(constructor.getName() +"---参数个数->" + constructor.getParameterCount());// 用获取到的构造器---创建对象 (注:本来那个public的构造器,才能创建)constructor.setAccessible(true);    // 静止检查访问权限(暴力反射)Object obj = constructor.newInstance("张三", 20);// 或者这样写
//        Object obj = (Student) constructor.newInstance("张三", 20);System.out.println(obj);System.out.println("---"+obj.getClass());}@Test@DisplayName("获取全部成员变量")public void test4() throws Exception {Class clazz = Student.class;// 获取成员变量java.lang.reflect.Field[] fields_onlypublic =  clazz.getFields();java.lang.reflect.Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {System.out.println(field.getName() +"----" + field.getType());}}@Test@DisplayName("获取某个成员变量、设置值、获取值")public void test5() throws Exception {Class clazz = Student.class;// 获取成员变量 (推荐这里用getDeclaredField)  而不是只有public的getField()java.lang.reflect.Field field = clazz.getDeclaredField("name");System.out.println(field.getName());  // name// 设置设置成员变量的值field.setAccessible(true);      // 静止检查访问权限(暴力反射)Student s = new Student();field.set(s, "李四");// 获取成员变量的值Object obj = field.get(s);System.out.println(obj);        // 李四}@Test@DisplayName("获取全部成员方法")public void test6() throws Exception {Class clazz = Student.class;// 获取成员方法java.lang.reflect.Method[] methods_onlypublic = clazz.getMethods();java.lang.reflect.Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName() +"----" + method.getReturnType());}}@Test@DisplayName("获取某个成员方法、调用方法")public void test7() throws Exception {Class clazz = Student.class;// 获取成员方法java.lang.reflect.Method method = clazz.getDeclaredMethod("show");// 获取name为show,且有参的java.lang.reflect.Method method2 = clazz.getDeclaredMethod("show", int.class);method.setAccessible(true); // 如果方法是私有的,就的打开。Student s = new Student();
//        method.invoke(s);       // 调用方法method2.invoke(s, 10);  // 有参的调用}}
public class Test {public static void main(String[] args) throws ClassNotFoundException {// 1 .获取类方式1Class clazz = Student.class;System.out.println(clazz);      // class com.taoke.d2.Student// 2. 获取类方式2Class clazz2 = Class.forName("com.taoke.d2.Student");System.out.println(clazz2);// 3.获取方式3Student student = new Student();Class clazz3 = student.getClass();System.out.println(clazz3);}}

反射用在了java开发框架上(开发个小框架)

在java框架如maven、 springboot上都有反射设计出了一些功能

准备:

1. Student类:  提示词 // 有成员变量(姓名、年龄、性别、身高、爱好)、无参构造器、有参构造器全部成员变量赋值

2. Teacher类: 提示词// 有成员变量(姓名、薪资)、无参构造器、有参构造器全部成员变量赋值

3. ObjectFrame:

import java.io.FileWriter;
import java.lang.reflect.Field;public class ObjectFrame {// 定义方法:保存任意对象的字段和值到一个文件中,文件结构如下/*=========类名1===========字段名1 = 字段值1字段名2 = 字段值2字段名3 = 字段值3=========类名2===========字段名1 = 字段值1字段名2 = 字段值2*/public static void saveObject(Object obj){// 任意对象中有多少个字段,我们不清楚,  反射可以解决try{// 1. 获取对象对应的Class对象Class<?> cls = obj.getClass();// 2. 获取对象的简单类名String className = cls.getSimpleName();// 3. 创建或覆盖一个文件,文件名为"objects.txt"FileWriter writer = new FileWriter("./objects.txt", true);// 4. 写入类名分隔线writer.write("=========" + className + "===========\n");// 5. 获取所有字段(包括私有字段)Field[] fields = cls.getDeclaredFields();// 6. 遍历所有字段for (Field field : fields) {// 7. 设置为可访问私有字段field.setAccessible(true);// 8. 获取字段名和值String fieldName = field.getName();Object fieldValue = field.get(obj);// 9. 写入字段信息writer.write(fieldName + " = " + fieldValue + "\n");}// 10. 关闭文件写入器writer.close();}catch(Exception e){e.printStackTrace();}}
}

 功能的核心思想,虽然不知道某个类有哪些字段,但是可以利用反射来实现

4. Test类:

public class Tset {public  void  save(){Student  s1 = new Student("彭于晏", 18, '男', 1.80, "打球");Teacher  t1 = new Teacher("刘德华", 50);// 需求:将s1和t1及其字段保存到文件中去。}
}

 三、注解

语法

 类上、成员变量、成员方法上 都能加 

 

只有一个叫value的, 或者 其他有默认值,添加注解时,可以省名称 

 原理

 元注解

有两个

        一个表示声明注解的保留周期

         另一个表示注解可用在哪些地方

 写一个时,就直接写,写多个时,用{}包起来

 比如Junit的Test注解是,RUNTIME, 保留到运行阶段

注解的解析(跟着操作下即可)

意思是,可以获取某个类头上用到的注解,

1. 先自定义一个,新增class选 @

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD})  // 限制注解使用位置:类和成员方法上
@Retention(RetentionPolicy.RUNTIME)  // 指定注解的有效范围:一直到运行时
public @interface MyTest {//  属性String value();double aaa() default 100.0;String[] bbb();
}

2. 新增class TestDemo

package com.taoke.d5;import org.junit.jupiter.api.Test;import java.lang.reflect.Method;
import java.util.Arrays;/*笔记/
1. .isAnnotationPresent(x)  判断当前头上是否存咋某个注解
2. .getAnnotation(x)          获取注解对象
3. .getDeclaredAnnotation(x)  获取某个注解对象
4. .getDeclaredAnnotations()  获取全部注解对象*/public class TestDemo {@Testpublic void test1() {// 解析Demo头上的注解(先if条件判定查询有无,再去拿)Class c = Demo.class;if (c.isAnnotationPresent(MyTest.class)) {// 获取注解对象MyTest myTest = (MyTest) c.getAnnotation(MyTest.class);// 获取注解的属性值System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(myTest.bbb()[0]);System.out.println(myTest.bbb()[1]);System.out.println(Arrays.toString(myTest.bbb()));}}@Testpublic void test2() {// 去获取Demo类中haha方法头上的注解(先判断)Class c = Demo.class;Method[] methods = c.getMethods();for (Method method : methods) {if (method.isAnnotationPresent(MyTest.class)) {MyTest myTest = method.getAnnotation(MyTest.class);System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(myTest.bbb()[0]);System.out.println(myTest.bbb()[1]);}}}
}@MyTest(value = "test",aaa = 100.0,bbb = {"aaa","bbb"})
class  Demo {@MyTest(value = "test",aaa = 100.0,bbb = {"刘亦菲","唐嫣"})void  haha(){}
}

http://www.xdnf.cn/news/7555.html

相关文章:

  • 【Java高阶面经】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
  • 从Ntfs!NtfsReadMftRecord函数到Ntfs!NtfsMapStream函数从0x274a到0xc4312800
  • SAR ADC 比较器寄生电容对性能的影响
  • 镜像管理(2)Dockerfile总结
  • 技术问答:PHP、JAVA和Go的垃圾回收机制有哪些区别
  • HarmonyOS5云服务技术分享--云函数创建配置指南
  • 软考软件评测师——黑盒测试测试方法
  • python 判断远程windows系统中某进程号是否还在
  • 电商运营数据分析指南之流量指标
  • lambda架构和kappa架构区别
  • 【Unity网络编程知识】协议生成工具Protobuf
  • 05 接口自动化-框架封装思想建立之httprunner框架(中)
  • Qt 控件发展历程 + 目标(1)
  • <uniapp><vuex><状态管理>在uniapp中,如何使用vuex实现数据共享与传递?
  • 基于“岗课赛证”融通的农业物联网专业教学方案
  • Ⅱ 链表 episode3
  • 自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models
  • 力扣第5题:最长回文子串(动态规划)
  • 【全解析】EN18031标准下的NMM网络监控机制
  • css使用clip-path属性切割显示可见内容
  • 【MySQL】第七弹——复习总结 视图
  • SSRF(服务器端请求伪造)基本原理靶场实现
  • CVE-2017-4971源码分析与漏洞复现
  • 谈谈对《加密算法》的理解
  • 零售智能执行大模型架构设计:从空间建模到上下文推理,再到智能Agent
  • DB31/T 1552-2025《居民电子健康档案应用系统等级评估指南》:上海地方标准全面解析
  • 什么是VR展示?VR展示的用途
  • 数据库4——存储过程及游标
  • leetcode 合并区间 java
  • ajax post请求 解决自动再get请求一次