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

背景

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

需求类型:不是仅仅支持单表业务的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)

开发速度:快

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

小结

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值