码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java的反射应用(Method和Class)


    记录:473

    场景:使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。

    版本:JDK 1.8。

    1.使用Java反射调用指定类的指定方法

    (1)参数说明

    String className, 字符串类型,需反射的类的全路径。

    String methodName, 字符串类型,需反射的类的方法名称。

    Object params,对象类型,反射调用方法的输入参数。

    Object,返回值,反射调用方法的输出参数。

    (2)代码实现

    1. public class ReflectApplyUtils {
    2. /**
    3. * 根据类名称和方法名称执行指定类的指定方法
    4. * 获取public方法
    5. * Method[] method01 = clasz.getMethods();
    6. * 获取private方法
    7. * Method[] method02 = clasz.getDeclaredMethods();
    8. */
    9. public static Object executeByName(String className, String methodName, Object params) {
    10. Object result = null;
    11. try {
    12. //1.根据类名称获取该类对应的Class对象
    13. Class clasz = Class.forName(className);
    14. //2.根据方法名称获取改方法对应的Method对象
    15. Method method = null;
    16. for (Method var1 : clasz.getMethods()) {
    17. if (StringUtils.equals(var1.getName(), methodName)) {
    18. method = var1;
    19. break;
    20. }
    21. }
    22. //3.执行具体方法
    23. if (method != null) {
    24. //获取方法的Modifier值,在根据Modifier定义的常量可以判断方式是哪种类型
    25. int var2 = method.getModifiers();
    26. if (Modifier.isPublic(var2) && Modifier.isStatic(var2)) {
    27. result = method.invoke(clasz, params);
    28. } else if (Modifier.isPublic(var2) && !Modifier.isStatic(var2)) {
    29. result = method.invoke(clasz.newInstance(), params);
    30. } else {
    31. throw new Exception("提供的方法名称: " + methodName + ",不是public类型,无权限执行.");
    32. }
    33. } else {
    34. throw new Exception("根据方法名称: " + methodName + ",无法找到对应Method,请检查输入的方法名称是否正确.");
    35. }
    36. } catch (Exception e) {
    37. result = e;
    38. }
    39. return result;
    40. }
    41. }

    2.一个普通Java类

    本示例中,将使用反射调用此类。

    1. /**
    2. * java.lang.StringBuffer,线程安全(A thread-safe)
    3. * java.lang.StringBuilder,非线程安全
    4. */
    5. public class HostSportGames {
    6. public static String tableTennisContest(TeamDto team) {
    7. StringBuffer sb = new StringBuffer();
    8. sb.append("执行业务: ").append(team.getTeamName())
    9. .append(team.getGroup()).append("参加")
    10. .append(team.getEvent()).append(",运动员:");
    11. StringBuffer finalSb = sb;
    12. team.getAthlete().forEach((item) -> {
    13. finalSb.append(item).append(",");
    14. });
    15. sb = sb.replace(sb.length() - 1, sb.length(), ".");
    16. System.out.println(sb);
    17. return "乒乓球比赛成功";
    18. }
    19. public String swimmingContest(TeamDto team) {
    20. StringBuilder sb = new StringBuilder();
    21. sb.append("执行业务: ").append(team.getTeamName())
    22. .append(team.getGroup()).append("参加")
    23. .append(team.getEvent()).append(",运动员:");
    24. StringBuilder finalSb = sb;
    25. team.getAthlete().forEach((item) -> {
    26. finalSb.append(item).append(",");
    27. });
    28. sb = sb.replace(sb.length() - 1, sb.length(), ".");
    29. System.out.println(sb);
    30. return "游泳比赛成功";
    31. }
    32. private Object footballContest(TeamDto team) {
    33. System.out.println("暂无此赛事.");
    34. return "暂无此比赛";
    35. }
    36. }

    3.Java反射调用指定类的指定方法

    (1)代码实现

    1. public class ApplyReflect {
    2. public static void main(String[] args) {
    3. //1.数据准备
    4. TeamDto team01 = TeamDto.builder()
    5. .teamName("中国乒乓球队")
    6. .group("男子组")
    7. .event("男单决赛")
    8. .athlete(Arrays.asList("ZhangS", "ZhaoL"))
    9. .build();
    10. TeamDto team02 = TeamDto.builder()
    11. .teamName("中国游泳队")
    12. .group("女子组")
    13. .event("200米决赛")
    14. .athlete(Arrays.asList("ZhangJ", "ZhaoX"))
    15. .build();
    16. List task01 = Arrays.asList(
    17. "com.hub.example.p11.reflect.work.HostSportGames",
    18. "tableTennisContest", team01
    19. );
    20. List task02 = Arrays.asList(
    21. "com.hub.example.p11.reflect.work.HostSportGames",
    22. "swimmingContest", team02
    23. );
    24. List> taskList = Arrays.asList(task01, task02);
    25. //2.执行业务
    26. for (List taskItem : taskList) {
    27. try{
    28. System.out.println("*******************************");
    29. String className = (String) taskItem.get(0);
    30. String methodName = (String) taskItem.get(1);
    31. TeamDto params = (TeamDto) taskItem.get(2);
    32. Object executeResult = null;
    33. System.out.println("执行" + className + "的" + methodName + "方法.");
    34. System.out.println("输入参数: " + params.toString());
    35. executeResult = ReflectApplyUtils.executeByName(className, methodName, params);
    36. System.out.println("输出结果: " + executeResult);
    37. }catch (Exception e){
    38. System.out.println("执行异常.");
    39. e.printStackTrace();
    40. }
    41. }
    42. System.out.println("*******************************");
    43. }
    44. }
    45. (2)输出日志

      1. *******************************
      2. 执行com.hub.example.p11.reflect.work.HostSportGames的tableTennisContest方法.
      3. 输入参数: TeamDto(teamName=中国乒乓球队, group=男子组, event=男单决赛, athlete=[ZhangS, ZhaoL])
      4. 执行业务: 中国乒乓球队男子组参加男单决赛,运动员:ZhangS,ZhaoL.
      5. 输出结果: 乒乓球比赛成功
      6. *******************************
      7. 执行com.hub.example.p11.reflect.work.HostSportGames的swimmingContest方法.
      8. 输入参数: TeamDto(teamName=中国游泳队, group=女子组, event=200米决赛, athlete=[ZhangJ, ZhaoX])
      9. 执行业务: 中国游泳队女子组参加200米决赛,运动员:ZhangJ,ZhaoX.
      10. 输出结果: 游泳比赛成功
      11. *******************************

      4.辅助实体类

      (1)说明

      在实体类中使用注解@Data等来自lombok-1.18.24.jar。

      (2)代码

      1. @Data
      2. @Builder
      3. @AllArgsConstructor
      4. @NoArgsConstructor
      5. public class TeamDto implements Serializable {
      6. //球队名称
      7. private String teamName;
      8. //组别:男子组/女子组/混合组
      9. private String group;
      10. //比赛项目名称
      11. private String event;
      12. //团队成员
      13. private List athlete;
      14. }

      以上,感谢。

      2023年9月13日

    46. 相关阅读:
      ICMP协议(二)
      JavaScript引用数据类型
      Java扫码点餐小程序源码 智慧点餐系统源码 点餐APP SaaS模式
      【Android笔记03】Android基本的UI控件(TextView、Button、EditText、ImageView、ProgressBar)
      全志A523(显示篇一)
      linux的基本指令(中)
      supOS工业操作系统getPropertiesHistory服务
      目标检测模型开发文档v1.0
      嵌入式操作系统C经典问题
      10分钟了解BIM+GIS融合,常见BIM数据格式及特性
    47. 原文地址:https://blog.csdn.net/zhangbeizhen18/article/details/132866266
      • 最新文章
      • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
        用 Hashids 优雅解决 C 端自增 ID 暴露问题
        V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
        LLVM Pass快速入门(四):代码插桩
        milkup:桌面端 markdown AI续写和即时渲染
        基于项目工程构建SBOM(软件物料清单)的研究
        鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
        .NET 中如何快速实现 List 集合去重?
        扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
        浅谈数据访问层
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号