Просмотр исходного кода

docs: 整理README.md授课代码与课堂练习题表格+更新20260814作业代码

- README.md二、授课代码:项目名列改为链接形式(点击跳转项目目录),多包项目包路径列精简清空
- README.md三、课堂练习题:涵盖知识点列精简为简洁核心知识点(去除冗长API细节描述)
- 授课代码c260814/homework0813:更新MethodPrivateTest/MiniJUnitTest/Student(反射暴力调用私有静态方法封装invokeAnyMethod、模拟测试框架JUnit简化版)
WanJL 1 неделя назад
Родитель
Сommit
b54496608c

Разница между файлами не показана из-за своего большого размера
+ 0 - 28
README.md


+ 47 - 5
授课代码/c260814/src/homework0813/MethodPrivateTest.java

@@ -1,11 +1,53 @@
 package homework0813;
 
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
 /**
+ * @author WanJl
+ * @version 1.0
  * @title MethodPrivateTest
- * @description 
- * @author WanJl 
- * @version 1.0 
- * @create 2026/8/14 
+ * @description
+ * @create 2026/8/14
  */
 public class MethodPrivateTest {
-}
+    public static void main(String[] args) throws Exception {
+        // 1. 创建 Student 对象,反射调用 setName("张三")(复用练习六工具)
+        Student student=new Student(101,"张三",25,"男","zhangsan@qq.com","13636363366");
+        // 2. 暴力反射调用私有实例方法 read()(invoke 传对象 s)
+
+        // 3. 暴力反射调用私有静态方法 write()(invoke 传 null)
+        // 4. 用封装好的 invokeAnyMethod 工具调用 read(obj 传 s)/ write(obj 传 null)
+        invokeAnyMethod(student,"read");
+        invokeAnyMethod(student.getClass(),"write");
+    }
+
+    // 通用工具:反射调用任意权限方法(getDeclaredMethod + setAccessible + invoke)
+    public static Object invokeAnyMethod(Object obj, String methodName, Object... args) throws Exception {
+        // 1. 计算参数类型数组
+        Class<?>[] argsClasses=new Class[args.length];
+        for (int i = 0; i < args.length; i++) {
+            argsClasses[i]=args[i].getClass();
+        }
+        //判断,obj到底是什么类型,如果obj属于Class类型,无论是那个类的Class对象,都会进入到if语句中
+        if (obj instanceof Class<?>){
+            //强转,把obj转换成Class类型
+            Class<?> clazz =(Class<?>)obj;
+            // 2. getDeclaredMethod(methodName, 参数类型...) 获取方法(含 private)
+            Method method = clazz.getDeclaredMethod(methodName, argsClasses);
+            // 3. setAccessible(true) 暴力反射放开权限
+            method.setAccessible(true);
+            // 4. invoke(obj, args) 调用并返回结果
+            return method.invoke(null,args);
+        }
+        //如果obj不是Class类型,说明传入进来的是其他的对象,要调用的也是其他的实例方法,而不是静态方法
+        Class<?> clazz=obj.getClass();
+        // 2. getDeclaredMethod(methodName, 参数类型...) 获取方法(含 private)
+        Method method = clazz.getDeclaredMethod(methodName, argsClasses);
+        // 3. setAccessible(true) 暴力反射放开权限
+        method.setAccessible(true);
+        // 4. invoke(obj, args) 调用并返回结果
+        return method.invoke(obj,args);
+    }
+}

+ 35 - 4
授课代码/c260814/src/homework0813/MiniJUnitTest.java

@@ -1,11 +1,42 @@
 package homework0813;
 
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
 /**
+ * @author WanJl
+ * @version 1.0
  * @title MiniJUnitTest
- * @description 
- * @author WanJl 
- * @version 1.0 
- * @create 2026/8/14 
+ * @description
+ * @create 2026/8/14
  */
 public class MiniJUnitTest {
+    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
+        // 1. 反射创建被测 Student 对象(getConstructor().newInstance())
+        Class<Student> studentClass = Student.class;
+        Student student = studentClass.getConstructor().newInstance();
+        // 2. getDeclaredMethods() 遍历 Student 全部方法
+        Method[] declaredMethods = studentClass.getDeclaredMethods();
+        // 3. 方法名以 "test" 开头 → 认定为测试方法
+        int count=0,a=0;
+        for (Method m: declaredMethods){
+            String methodName = m.getName();
+            if(methodName.startsWith("test")){
+                // 4. 对每个测试方法:setAccessible(true) + invoke(obj) 执行
+                m.setAccessible(true);
+                try {
+                    m.invoke(student);
+                    // 5. 捕获 InvocationTargetException → getCause() 打印真实异常
+                    a++;
+                } catch (IllegalAccessException e) {
+                    count++;
+                } catch (InvocationTargetException e) {
+                    count++;
+                }
+            }
+        }
+        // 6. 统计通过/失败个数
+        System.out.println("失败个数:"+count);
+        System.out.println("成功个数:"+a);
+    }
 }

+ 15 - 2
授课代码/c260814/src/homework0813/Student.java

@@ -1,4 +1,4 @@
-package course;
+package homework0813;
 
 /**
  * @author WanJl
@@ -7,7 +7,7 @@ package course;
  * @description
  * @create 2026/8/12
  */
-public class Student{
+public class Student {
     private Integer id;
     private String name;
     private Integer age;
@@ -107,5 +107,18 @@ public class Student{
     public void study(){
         System.out.println(name+"在学习.....");
     }
+
+    // 来源:course/Student.java(模拟被测类的测试方法)
+    private void testAdd() {
+        System.out.println("测试:加法计算");
+        int a = 1 + 1;
+        if (a != 2) throw new RuntimeException("加法计算错误");
+    }
+    private void testHello() {
+        System.out.println("测试:打招呼 " + this.name);
+    }
+    private void testFail() {
+        throw new RuntimeException("故意失败的方法");
+    }
 }
 

Некоторые файлы не были показаны из-за большого количества измененных файлов