• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

利用Java反射做通用框架

以下内容均由AI生成

Cat类

点击查看代码
package com.itcq.reflect.test;

public class Cat {
    public void eat(){
        System.out.println("猫爱吃鱼~~~");
    }

    public void sleep(){
        System.out.println("猫睡觉打呼噜~~~");
    }
}

Dog类

点击查看代码
package com.itcq.reflect.test;

public class Dog {
    public void eat() {
        System.out.println("狗爱吃肉~~~");
    }

    public void sleep() {
        System.out.println("狗睡觉流口水~~~");
    }

}

App

点击查看代码
package com.itcq.reflect.test;

import org.junit.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ResourceBundle;

public class App {
    //反射做通用框架
    //需求: 要把猫的睡觉方法 变成 狗吃饭的方法
    @Test
    public void testCat(){
        try {
            Class clazz = Class.forName("com.itcq.reflect.test.demo1.Cat");
            Cat cat = (Cat) clazz.newInstance();
            Method sleep = clazz.getDeclaredMethod("sleep");
            sleep.invoke(cat);

            ResourceBundle bundle = ResourceBundle.getBundle("animal");
            String className = bundle.getString("className");
            String methodName = bundle.getString("methodName");

            clazz = Class.forName(className);
            Method method = clazz.getDeclaredMethod(methodName);
            method.invoke(clazz.newInstance());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }


}

代码分析与解读

代码功能概述

这段代码主要演示了如何使用 Java 反射来实现一个灵活的、可配置的框架。通过修改配置文件,可以动态地改变程序的行为,而无需修改源代码。

代码详细解读

  1. 定义两个类:Cat 和 Dog

    • 两个类分别代表猫和狗,它们都有 eat 和 sleep 方法,用于模拟动物的行为。
  2. 测试类 App

    • testCat 方法是测试用例。
    • 首先,通过反射获取 Cat 类的实例,并调用其 sleep 方法。
    • 然后,从 animal.properties 配置文件中读取 className 和 methodName,动态地获取指定类的指定方法并调用。
  3. 配置文件 animal.properties

    • 用于配置要调用的类和方法。
    • 通过修改配置文件,可以灵活地改变程序的行为。

代码运行流程

  1. 加载类:通过 Class.forName 加载指定的类。
  2. 获取方法:通过 getDeclaredMethod 获取指定的方法。
  3. 创建对象:通过 newInstance 创建类的实例。
  4. 调用方法:通过 invoke 调用指定的方法。

代码意义与优势

  • 灵活配置: 通过修改配置文件,可以轻松地改变程序的行为,而无需修改源代码。
  • 通用性强: 该框架可以应用于各种类似的场景,只要定义好配置文件,就可以实现不同的功能。
  • 动态性: 在运行时动态地加载类和调用方法,增加了程序的灵活性。

为什么这么做?

  • 维护性好: 当需求发生变化时,只需要修改配置文件,而无需修改源代码,降低了维护成本。
  • 扩展性强: 可以很容易地添加新的类和方法,扩展系统的功能。
  • 解耦: 将配置信息从代码中分离出来,提高了代码的可读性和可维护性。

你的问题:

这么做的意义何在 运维后期 修改一下配置文件即可实现需求 不再需要改变源码了

关于“这么做的意义”,我再补充几点:

  • AOP(面向切面编程)的雏形: 虽然这个例子很简单,但它体现了 AOP 的思想。通过配置文件,我们可以动态地对目标对象的方法进行增强或替换。
  • 插件化开发: 可以将不同的功能模块作为插件开发,通过配置文件来加载和配置这些插件。
  • 热部署: 在某些场景下,可以实现热部署,即在程序运行过程中动态地加载新的类或修改配置,而无需重启应用程序。

总结

这个例子展示了 Java 反射在构建灵活、可扩展的应用程序中的强大能力。通过合理地利用反射机制,我们可以实现很多高级的功能,提高系统的可维护性和扩展性。

如果你还有其他问题,欢迎随时提出!

拓展思考

  • 性能问题: 反射的性能相对较低,在性能要求较高的场景下,需要谨慎使用。
  • 安全性问题: 不当使用反射可能会导致安全问题,例如绕过访问控制。
  • 复杂性: 反射的代码相对复杂,需要小心处理异常。

在实际开发中,需要根据具体的场景和需求,权衡反射的优点和缺点,选择合适的技术方案。

posted on 2024-12-05 13:18  周政然  阅读(37)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3