java不写类实现业务逻辑的方法调研

文章目录

  • 背景
  • 实现方法介绍
    • 1.动态代理(Dynamic Proxy)
    • 2. 字节码操作库(Bytecode Manipulation Libraries)
    • 3.表达式语言(Expression Language)
    • 4.脚本语言(Scripting Languages)
  • 技术方案优缺点分析
    • 1. 动态代理(Dynamic Proxy)
    • 2. 字节码操作库(Bytecode Manipulation Libraries)
    • 3. 表达式语言(Expression Language)
    • 4. 脚本语言(Scripting Languages)
    • 小结
  • 开发效率分析
    • 1. 动态代理(Dynamic Proxy)
    • 2. 字节码操作库(Bytecode Manipulation Libraries)
    • 3. 表达式语言(Expression Language)
    • 4. 脚本语言(Scripting Languages)
    • 小结

背景

研究后端复杂业务低代码技术实现不写实际代码,动态实现业务的可能技术方案, 作为技术选型的参考。(持续收集中)

需求类型:不是仅仅支持单表业务的curd简单业务

实现方法介绍

1.动态代理(Dynamic Proxy)

Java 提供了动态代理机制,允许你在运行时动态生成类和实现接口。你可以使用 java.lang.reflect.Proxy 来创建动态代理。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyDemo {
    public interface Service {
        void perform();
    }

    public static class ServiceInvocationHandler implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Executing method: " + method.getName());
            return null;
        }
    }

    public static void main(String[] args) {
        ServiceInvocationHandler handler = new ServiceInvocationHandler();
        Service proxyInstance = (Service) Proxy.newProxyInstance(
                Service.class.getClassLoader(),
                new Class[]{Service.class},
                handler
        );

        proxyInstance.perform();
    }
}

2. 字节码操作库(Bytecode Manipulation Libraries)

可以使用如 Javassist 或 ASM 这样的字节码操作库在运行时生成或修改类

import javassist.*;

public class JavassistDemo {
    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.makeClass("com.example.GeneratedClass");

        CtMethod method = CtNewMethod.make("public void sayHello() { System.out.println(\"Hello, World!\"); }", cc);
        cc.addMethod(method);

        Class<?> generatedClass = cc.toClass();
        Object instance = generatedClass.newInstance();
        generatedClass.getMethod("sayHello").invoke(instance);
    }
}

3.表达式语言(Expression Language)

使用像 QLExpress 这样的表达式语言来编写业务逻辑,然后在运行时解析和执行这些表达式。

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;

public class QLExpressDemo {
    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();
        DefaultContext<String, Object> context = new DefaultContext<>();
        context.put("a", 10);
        context.put("b", 20);

        String expression = "a + b";
        Object result = runner.execute(expression, context, null, true, false);
        System.out.println("Result: " + result);
    }
}

4.脚本语言(Scripting Languages)

使用 Java 提供的脚本引擎(如 Nashorn、GraalVM)来运行动态脚本,如 JavaScript、Groovy 等。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class ScriptingDemo {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");

        String script = "function greet(name) { return 'Hello, ' + name; } greet('World')";
        Object result = engine.eval(script);
        System.out.println(result);
    }
}

技术方案优缺点分析

各个方法在不同场景下都有各自的优缺点,下面进行详细分析

1. 动态代理(Dynamic Proxy)

优点:

  • 简洁:动态代理机制相对简单,只需实现一个 InvocationHandler 接口。
  • 灵活:可以在运行时改变代理类的行为。
    无需第三方库:标准 Java 反射 API 提供。

缺点:

  • 性能开销:反射机制存在一定的性能开销。
  • 接口限制:只能代理实现接口的类,不能代理具体类。

2. 字节码操作库(Bytecode Manipulation Libraries)

优点:

  • 强大:可以动态生成或修改类,几乎没有限制。
  • 性能高:生成的字节码在性能上接近手写代码。

缺点:

  • 复杂性高:字节码操作比较复杂,调试困难。
  • 依赖第三方库:需要引入如 Javassist 或 ASM 等库。

3. 表达式语言(Expression Language)

优点:

  • 灵活性:可以用简单的表达式描述业务逻辑,适合规则引擎等场景。
  • 易于修改:业务规则可以在不修改代码的情况下进行调整。

缺点:

  • 性能一般:表达式解析和执行的性能较直接代码调用要差。
  • 功能有限:表达式语言通常无法完成复杂的业务逻辑。

4. 脚本语言(Scripting Languages)

优点:

  • 动态性强:可以在运行时加载和执行脚本,适合高度动态的需求。
  • 语言多样性:支持多种脚本语言,如 JavaScript、Groovy 等。

缺点:

  • 性能较低:脚本解释执行的性能通常不如编译后的 Java 代码。
  • 安全性问题:动态执行脚本可能引入安全风险,需要严格控制和验证脚本内容。

小结

  • 动态代理 适用于需要在运行时动态改变方法行为且只需要代理接口的场景。
  • 字节码操作库 适用于需要高度灵活性和性能的场景,但需要开发者具备较高的技术能力。
  • 表达式语言 适用于规则引擎或简单业务逻辑的动态执行,简洁易用但性能一般。
  • 脚本语言 适用于需要高动态性和灵活性的场景,支持多种语言但存在性能和安全性问题。

开发效率分析

1. 动态代理(Dynamic Proxy)

开发速度:快

原因:实现简单,只需要实现 InvocationHandler 接口并且不需要额外的第三方库。
适用场景:适合需要快速实现接口代理的场景,如 AOP(面向切面编程)。

2. 字节码操作库(Bytecode Manipulation Libraries)

开发速度:慢

原因:涉及字节码操作,学习曲线陡峭,代码复杂度高,调试困难。
适用场景:适合需要高性能和复杂动态生成类的场景,如动态生成大量类或方法。

3. 表达式语言(Expression Language)

开发速度:中等

原因:编写和修改表达式相对简单,但需要配置和学习使用表达式引擎。
适用场景:适合规则引擎、配置化业务逻辑等场景,适用于频繁变更业务规则的需求。

4. 脚本语言(Scripting Languages)

开发速度:快

原因:可以直接编写脚本,修改方便,特别是对于熟悉脚本语言的开发者。
适用场景:适合需要快速迭代和动态加载业务逻辑的场景,如插件系统、游戏脚本。

小结

  • 动态代理 是最快的开发方式,特别是当需求只是简单的接口代理时。
  • 字节码操作库 的开发速度最慢,因为涉及复杂的字节码操作和调试。
  • 表达式语言 的开发速度中等,适合规则引擎和简单业务逻辑。
  • 脚本语言 的开发速度快,适合快速迭代和动态加载需求。

对于快速开发,可以考虑使用动态代理或脚本语言。而对于需要高度动态性和性能的场景,尽管字节码操作库开发较慢,但它提供了强大的灵活性和性能保障

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/761427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

J019_选择排序

一、排序算法 排序过程和排序原理如下图所示&#xff1a; 二、代码实现 package com.itheima.sort;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {int[] arr {5, 4, 3, 1, 2};//选择排序for (int i 0; i < arr.length - 1…

django西餐厅管理系统-计算机毕业设计源码10873

摘要 在现代餐饮行业中&#xff0c;高效的管理系统对于西餐厅的成功运营至关重要。为了满足西餐厅日益增长的管理需求&#xff0c;设计并实现了一款基于 Python 的西餐厅管理系统。 Python作为一种简洁而易读的编程语言&#xff0c;具有广泛的应用领域&#xff0c;包括Web开发。…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

docker的安装与基本使用

一.docker的安装卸载 1.先安装所需软件包 yum install -y yum-utils2.设置stable镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.安装DOCKER CE yum -y install docker-ce docker-ce-cli containerd.io 4.验…

【SpringCloud】Eureka源码解析 上

Eureka是一个服务发现与注册组件&#xff0c;它包含服务端和客户端&#xff0c;服务端管理服务的注册信息&#xff0c;客户端简化服务实例与服务端的交互。我们结合源码来分析下eureka组件的实现原理&#xff0c;内容分为上下两章&#xff0c;第一章分析eureka的服务注册&#…

【每日一练】python if选择判断结构应用

应用类 1. 计算面积 编写一个Python程序&#xff0c;计算矩形的面积。要求用户输入矩形的宽和高&#xff0c;然后计算并打印面积。 width float(input("请输入矩形的宽&#xff1a;")) height float(input("请输入矩形的高&#xff1a;")) if width &…

《数字图像处理与机器视觉》案例三 (基于数字图像处理的物料堆积角快速测量)

一、前言 物料堆积角是反映物料特性的重要参数&#xff0c;传统的测量方法将物料自然堆积&#xff0c;测量物料形成的圆锥表面与水平面的夹角即可&#xff0c;该方法检测效率低。随着数字成像设备的推广和应用&#xff0c;应用数字图像处理可以更准确更迅速地进行堆积角测量。 …

Visual Studio 设置回车代码补全

工具 -> 选项 -> 文本编辑器 -> C/C -> 高级 -> 主动提交成员列表 设置为TRUE

萨科微slkor金航标kinghelm的品牌海外布局

萨科微slkor&#xff08;www.slkormicro.com&#xff09;金航标kinghelm宋仕强在介绍品牌的海外布局时说&#xff0c; 萨科微目前在土耳其、印度、新加坡均有代理商&#xff0c;海外代理商还在不断的发展和筛选中&#xff01;欢迎公司有资质&#xff0c;在当地有一定客户关系的…

Axure 中继器 实现选取表格行、列交互

Axure 中继器 实现选取表格行、列交互 引言 在办公软件或富文本编辑器中插入表格的时候我们经常可以通过在表格上移动鼠标&#xff0c;可以选取想要插入的表格行、列数。 本文分享如何通过 Axure 实现这个交互。 放入中继器 这个交互的用到了中继器&#xff0c;所以首先在…

WPF/C#:BusinessLayerValidation

BusinessLayerValidation介绍 BusinessLayerValidation&#xff0c;即业务层验证&#xff0c;是指在软件应用程序的业务逻辑层&#xff08;Business Layer&#xff09;中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分&#xff0c;负责处理与业务规则和逻辑相关的…

【C++】继承(详解)

前言&#xff1a;今天我们正式的步入C进阶内容的学习了&#xff0c;当然了既然是进阶意味着学习难度的不断提升&#xff0c;各位一起努力呐。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &#x1f448; &#…

2065. 最大化一张图中的路径价值 Hard

给你一张 无向 图&#xff0c;图中有 n 个节点&#xff0c;节点编号从 0 到 n - 1 &#xff08;都包括&#xff09;。同时给你一个下标从 0 开始的整数数组 values &#xff0c;其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开始的二维整数数组 edges &#xf…

电子技术基础(模电部分)笔记

终于整理出来了&#xff0c;可以安心复习大物线代了&#xff01;&#xff01; 数电部分预计7.10出

007-GeoGebra基础篇-构建等边三角形

今天继续来一篇尺规作图&#xff0c;可以跟着操作一波&#xff0c;刚开始我写的比较细一点&#xff0c;每步都有截图&#xff0c;后续内容逐渐复杂后我就只放置算式咯。 目录 一、先看看一下最终效果二、本次涉及的内容三、开始尺规画图1. 绘制定点A和B2. 绘制线段AB3. 以点A为…

【日记】度过了一个堕落的周末……(184 字)

正文 昨天睡了一天觉&#xff0c;今天看了一天《三体》电视剧。真是堕落到没边了呢&#xff08;笑。本来想写代码完成年度计划&#xff0c;或者多写几篇文章&#xff0c;但实在不想写&#xff0c;也不想动笔。 感觉这个周末什么都没做呢&#xff0c;休息倒是休息好了。 今天 30…

基于x86/ARM+FPGA+AI工业相机的智能工艺缺陷检测,可以检测点状,线状,面状的缺陷

应用场景 缺陷检测 在产品的制造生产环节中发挥着极其重要作用。智能工业缺陷检测能够替代传统的人工检测&#xff0c;降低人为判断漏失&#xff0c;使得产品质量大幅提升的同时降低了工厂的人力成本。智能工艺缺陷检测技术可以检测点状&#xff0c;线状&#xff0c;面状的缺陷…

UnityUGUI之四 Mask

会将上级物体遮盖 注&#xff1a; 尽量不使用Mask&#xff0c;因为其会过度消耗运行资源&#xff0c;可以使用Rect 2DMask&#xff0c;但容易造成bug&#xff0c;因此最好实现遮罩效果的方式为自己写一个mask物体

用易查分下发《致家长一封信》,支持在线手写签名,一键导出PDF!

暑假来临之际&#xff0c;学校通常需要下发致家长信&#xff0c;以正式、书面的形式向家长传达重要的通知或建议。传统的发放方式如家长签字后学生将回执单上交&#xff0c;容易存在丢失、遗忘的问题。 那么如何更高效、便捷、安全地将致家长一封信送达给每位家长呢&#xff1f…

项目方案:社会视频资源整合接入汇聚系统解决方案(八)---视频监控汇聚应用案例

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分…