Scala宏:为Java Pojo

时间:2016-12-20 15:34:20

标签: scala scala-macros

我目前正在处理相当大的代码库,其中新代码是用scala编写的,但是仍有许多旧的Java代码。特别是我们需要与很多Java API进行交流。旧代码使用带有公共非最终字段的简单Java Pojos,没有任何方法或构造函数,例如:

public class MyJavaPojo {
    public String myField1;
    public MyOtheJavaPojo myField2;
}

请注意,我们没有为这些类型添加辅助方法或构造函数的选项。这些目前创建的像旧的c-structs(预先命名的参数),如下所示:

val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...

因此,很容易忘记分配其中一个字段,特别是当我们突然向MyJavaPojo类添加新字段时,编译器不会抱怨我&#39 ; ve将一个字段留空。

注意:我们没有选择以正常方式修改java类型/添加构造函数。我们也不想开始为对象创建创建大量手动创建的辅助函数 - 我们真的希望找到一个基于scala宏的解决方案而不是可能!

我想要做的是创建一个宏,为我的Pojos生成类似构造函数的方法,或者创建工厂的宏,允许命名参数。 (基本上让宏执行工作,而不是在scala中创建大量手动编写的辅助方法)。

你知道用scala宏做任何方法吗? (我确定它可能,但我一生中从来没有写过scala宏)

期望的API替代方案1:

val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...)

期望的API替代方案2

val factory = someMacro[MyJavaPojo]
val myPojo = factory.apply(myField1 = ..., myField2 = ...)

注意/重要:命名参数!

我正在寻找一个现成的解决方案或提示我可以在哪里阅读。

赞赏所有想法和意见!

1 个答案:

答案 0 :(得分:1)

看看scala-beanutils

@beanCompanion[MyJavaPojo] object MyScalaPojo

MyScalaPojo(...)

它可能无法直接工作,因为您的类不是bean而且它仅用于Scala 2.10,但源代码是< 200行,应该让你知道从哪里开始。