首页 > 编程语言 >利用Java反射做通用框架

利用Java反射做通用框架

时间:2024-12-05 13:20:58浏览次数:5  
标签:反射 Java 框架 配置文件 代码 Cat sleep public

以下内容均由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

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

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

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

代码运行流程

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

代码意义与优势

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

为什么这么做?

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

你的问题:

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

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

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

总结

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

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

拓展思考

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

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

标签:反射,Java,框架,配置文件,代码,Cat,sleep,public
From: https://www.cnblogs.com/itcq1024/p/18588335

相关文章

  • 探索实用的Java工具类
    1.排序有时需要对集合进行排序。此时可以使用Collections的sort方法。List<Integer>list=newArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//ASCSystem.out.println("ASC-排序后:"+list......
  • PHP Laravel框架架构
    1.根目录结├──app/├──artisan├──bootstrap/├──config/├──database/├──public/├──resources/├──routes/├──storage/├──tests/├──.env├──.gitignore├──composer.json├──package.json├──phpunit.xml......
  • 【一文读懂】SPI机制之JAVA的SPI实现详解
    ......
  • 【最新原创毕设】基于SpringBoot的网上报修平台+94800(免费领源码)可做计算机毕业设计JA
    摘要随着信息技术的快速发展和普及,高校宿舍管理面临着诸多挑战与机遇。传统的宿舍管理模式,如手工记录报修信息、纸质文档管理等,已无法满足现代高校对效率和便捷性的需求。因此,开发一套高效、智能的网上报修平台显得尤为重要。基于springBoot的网上报修平台的设计和实现正......
  • 【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现
    ......
  • (面试常考)Java基础 - 接口与抽象类的区别
    接口接口(Interface)的传统定义是只能包含抽象方法(即没有方法体的方法)以及常量。但是从Java8开始,接口可以包含非抽象方法了。这些非抽象方法包括:默认方法(DefaultMethods):使用default关键字声明的方法。它们允许在接口中提供一个方法的默认实现,这样实现了该接口的类可......
  • dagger.js:可能是我见过的最简单易用的前端框架了
    向大家推荐一款轻量完备且简单易用的开源前端框架dagger.js。01.什么是dagger.jsdagger.js是一个基于html的描述式单页应用开发框架,通过在页面DOM元素上添加语义化的指令来驱动业务逻辑。从语法特性的角度来说,dagger.js模板+指令的工作方式与Angular/Vue比较接近。dagger.js......
  • Java 界最好用的开源行为验证码工具!
    大家好,我是Java陈序员。今天,给大家介绍一个开源的基于Java实现的行为验证码工具!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍TIANAI-CAPTCHA——天爱验证码,基于Java实现的开源行为验证码,涵盖滑块验证码、旋转......
  • 常用JavaScript 单行代码
    1.不使用临时变量来交换变量的值例如我们想要将a于b的值交换leta=1,b=2;//交换值[a,b]=[b,a];//结果:a=2,b=12.对象解构,让数据访问更便捷const{name,age}={name:'张三',age:23};//结果:name='张三',age=233.浅克隆对象......
  • C# 使用反射进行类型信息的动态获取
    反射基础概念反射是指在运行时动态地获取程序集、模块、类型、成员(方法、属性、字段等)的相关信息,并且能够在运行时动态地调用类型的成员或创建类型的实例。在C#中,System.Reflection命名空间提供了进行反射操作的各种类和接口。获取类型信息获取当前程序集中的类型可以......