如何从 Groovy 构造一个(非静态)Java 内部类

Posted

技术标签:

【中文标题】如何从 Groovy 构造一个(非静态)Java 内部类【英文标题】:How do I construct a (non-static) Java inner class from Groovy 【发布时间】:2015-01-16 09:00:41 【问题描述】:

如果我有一个像这样的内部类的类:

public class A 
    class B  //note, no modifier on class or constructor
      B(String c) System.out.println(c);
    

从 Java(在同一个包中)我可以这样做:

public class C 
    public static void main(String[] args) 
        A a = new A();
        System.out.println(a. new B("test")); //crazy syntax!
    

但在 Groovy 中,这是行不通的。那么如何[从同一个包中的 groovy 类] 构造一个新的 B?

【问题讨论】:

我一直认为在创建A的实例时,你是在自动创建B的实例 @JClassic 不,实例化 A 不会自动创建 B 的实例 【参考方案1】:

我让它像这样工作:

def a = new A()
A.B.newInstance(a, "foo")

还有这样的:

def a = new A()
new A.B(a, "foo")

如果 Java 代码在您的控制之下,而不是作为外部库,那么我宁愿使用工厂方法。

【讨论】:

【参考方案2】:

试试这个

    A a = new A();
    System.out.println(new B(a, "test")); //crazy syntax!

【讨论】:

groovy 1.7 发行说明介绍了为什么在添加对内部类的支持时会出现这种语法:docs.codehaus.org/display/GROOVY/Groovy+1.7+release+notes 如果没有资格 Bnew A.B(a, "test")(使用 Groovy 2.3.9),我无法让它工作 这不起作用。我得到“Groovyc:无法解析 B 类”

以上是关于如何从 Groovy 构造一个(非静态)Java 内部类的主要内容,如果未能解决你的问题,请参考以下文章

java中成员变量代码块构造函数运行顺序

java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

Java子父类间静态代码块非静态代码块构造方法的执行顺序

java中静态代码块,非静态代码块,构造函数执行顺序

Java基础

java类的加载顺序,静态块 非静态块 构造器属性方法等