跳到主要内容

概述

ActiveJ Codegen是一个高效的Java代码生成器,具有精简和简单的API。 它建立在ObjectWeb ASM之上,具有零开销的性能。 ActiveJ Codegen在 ActiveJ Serializer,使其成为世界上最快的基于JVM的序列化器,被广泛利用。 ActiveJ Codegen是ActiveJ技术之一,但它对第三方的依赖性很小,可以作为一个独立的组件使用。

为什么是ActiveJ Codegen?#

  • 利用强大的ASM库进行代码生成和操作
  • 提供简洁的表达式API,提供类似Lisp的DSL,用于描述新的类。
  • 支持对生成的类进行缓存
  • 适用于基于运行时参数的动态类生成(如查询处理)。
  • 支持单个项目的关系代数操作:聚合函数、谓词、排序、分组等。
  • 特点是自动类型推理
  • 零开销的性能
  • 支持记录(异质数据容器)。

代码生成#

假设我们想创建一个实现 Person 接口的类。

公共接口Greeter {    void sayHello();}

sayHello() 方法被调用时,一个生成的类应该简单地打印 "Hello World"。

public class WorldGreeter implements Greeter {    @Override    public void sayHello() {        System.out.println(" Hello World");    }}

为了以编程方式生成这样的类,我们应该使用一个 "ClassBuilder 类 来定义一个类应该如何被创建。 而我们需要使用 "定义类加载器"(DefiningClassLoader 来实际定义一个新的类。

DefiningClassLoader classLoader = DefiningClassLoader.create();
Class<Greeter> greeterClass = ClassBuilder.create(Greeter.class)        .withMethod("sayHello",                call(staticField(System.class, "out"), "println", value("Hello world") )        .defineClass(classLoader) 。)

注意 call(staticField(System.class, "out"), "println", value("Hello world")) 的表达。

这就是Expressions DSL的模样。 首先,我们访问 System 类中的静态字段 out。 然后我们对它调用 println() 方法,将值 "Hello world" 作为参数。 这相当于一个 System.out.println("Hello world)

当这个类的一个新实例被创建并调用 sayHello() 方法时,输出结果是 "Hello world" ,符合预期。

Greeter greeter = greeterClass.getDeclaredConstructor().newInstance();greeter.sayHello(); //向stdout打印 "Hello world"。

这仅仅是ActiveJ Codegen能力的一个暗示。 欲了解更多信息,请参考实例或内部文件。

将ActiveJ Codegen添加到您的项目中#

您可以通过导入ActiveJ Codegen的Maven资源库将其加入您的项目。 这些文档涵盖了ActiveJ Codegen的最新版本 v5.0-beta2 (见上 GithubMaven)。)