Scala宏:为Java Pojo生成工厂或ctor

Scala宏:为Java Pojo生成工厂或ctor,scala,scala-macros,Scala,Scala Macros,我目前正在使用相当大的代码库,其中新代码是用scala编写的,但仍保留了大量旧Java代码。特别是,我们需要与很多java API交流。旧代码使用带有公共非最终字段的简单Java POJO,,没有任何方法或构造函数,例如: public class MyJavaPojo { public String myField1; public MyOtheJavaPojo myField2; } 请注意,我们没有向这些类型添加助手方法或构造函数的选项。当前创建的这些结构与旧的c结构(预

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

public class MyJavaPojo {
    public String myField1;
    public MyOtheJavaPojo myField2;
}
请注意,我们没有向这些类型添加助手方法或构造函数的选项。当前创建的这些结构与旧的c结构(预先命名的参数)类似,如下所示:

val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...
因此,很容易忘记指定一个字段,特别是当我们突然向MyJavaPojo类添加新字段时,编译器不会抱怨我将一个字段保留为null

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

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

你知道用scala宏做这件事的方法吗?(我确信这是可能的,但我一生中从未编写过scala宏)

所需API备选方案1:

val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...)
所需API备选方案2

val factory = someMacro[MyJavaPojo]
val myPojo = factory.apply(myField1 = ..., myField2 = ...)
注意/重要事项:命名参数

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

感谢所有的想法和意见

看一看


它可能不会直接工作,因为您的类不是bean,它只是为Scala 2.10制作的,但是源代码<200行,应该让您知道从哪里开始。

Cool project。谢谢
@beanCompanion[MyJavaPojo] object MyScalaPojo

MyScalaPojo(...)