无法从.java类访问带有参数的@Immutable类的构造函数

无法从.java类访问带有参数的@Immutable类的构造函数,java,groovy,gradle,abstract-syntax-tree,Java,Groovy,Gradle,Abstract Syntax Tree,我清理生成的.class文件,并重新构建我的应用程序。如果对生成的AST构造函数的第一次调用发生在.java类中,我会得到一个错误。但如果我首先调用由.groovy类中的@Immutable注释生成的构造函数,它将对.java类可见,因为字节码已经生成,并且没有错误发生 所以我想知道如何设置gradle,让它首先用所需的AST转换编译所有groovy类,这样我就可以从.java类中正确使用它了?另外,既然javac没有看到任何ClassName.bulder()方法,那么如何使用@Builder

我清理生成的.class文件,并重新构建我的应用程序。如果对生成的AST构造函数的第一次调用发生在.java类中,我会得到一个错误。但如果我首先调用由.groovy类中的
@Immutable
注释生成的构造函数,它将对.java类可见,因为字节码已经生成,并且没有错误发生

所以我想知道如何设置gradle,让它首先用所需的AST转换编译所有groovy类,这样我就可以从.java类中正确使用它了?另外,既然javac没有看到任何
ClassName.bulder()
方法,那么如何使用
@Builder
从.java类生成的代码呢

  • 这是我与ASTT的.groovy类

    @Immutable class A {
        String a;
    }
    
  • 下面是我如何从.java类调用它的构造函数

    public class Test {
         A b = new A("321");
    }
    
  • 我得到的错误是:

    错误:“类[skipped]中的构造函数无法应用于给定类型;必需:未找到参数:[skipped]原因:实际和 形式参数列表的长度不同”


  • 我正在使用Intellij IDEA 14.4和Gradle进行构建。

    我曾经遇到过类似的问题。对我来说,有效的方法是通过将build.gradle中的源代码集设置为空列表(见下面的代码)来阻止Java在Groovy之前运行

    据我所知,Groovy编译器将通过这种方式将Java文件委托给Java,但会按照正确的顺序进行。另一方面,Java编译将忽略Groovy文件,这将导致您看到的未实现的依赖关系

    plugins {
        id 'groovy'
        id 'java'
    }
    
    sourceCompatibility = 11
    
    sourceSets {
        main {
            java {
                srcDirs = [] // don't compile Java code twice
            }
            groovy {
                srcDirs += 'src/main/java'
            }
        }
    }
    
    // …
    

    你有一个简单的例子吗?创建一个构造函数拥有的类(对象)的实例。这将自动调用构造函数。我发现的问题似乎与Groovy完全相同,但Groovy还不可能做到这一点。看到这个问题了吗