Groovy Java交叉编译实例

时间:2013-08-27 18:56:27

标签: java groovy casting instanceof

我正在寻找一种从Java检查的方法,一些对象是一些Groovy类的实例。

由于编译过程(包括Java类存根生成),每个Groovy类看起来都是不可能的。因此,使用Groovy类的instanceof将返回false。

在Watches窗口中,我可以测试它。

ModelNode.class = {java.lang.Class@4830}"class ModelNode"
component.getClass() = {java.lang.Class@3073}"class ModelNode"
component instanceof ModelNode = false

显然,有两个不同的类。而Java看到生成了一个。所以,我正在寻找一种很好的方法来检查Groovy类的一些对象。

我尝试了reflexion和getSuperclass()方法,看起来有两个绝对不同的类,派生自同一个超类。

component.getClass().getSuperclass() = {java.lang.Class@871}"class javax.swing.tree.DefaultMutableTreeNode"
ModelNode.class.getSuperclass() = {java.lang.Class@871}"class javax.swing.tree.DefaultMutableTreeNode"

此外由于类似原因,我无法在instanceof之后投射任何内容。所以,我一定是做了错误的

有没有办法在Java中使用Groovy对象。没有java代码方法所需的Java端口接口。

P.S。最后一句是关于这样的解决方案。

在Java中

interface A {
  foo();
}

assert(object instanceof B) // false;
((A)object).foo(); // fail
assert(object instanceof A) // true;
((A)object).foo(); // nice

在Groovy中

class B extends SMTH implements A { ... }

1 个答案:

答案 0 :(得分:3)

instanceof GroovyObject

我创建了以下Java类:

import groovy.lang.GroovyObject;

public class A {
  public static void main(String[] args) {
    B b = new B();
    if (b instanceof GroovyObject) {
      System.out.println("b is a groovyobject");
      b.yeah();
    } else {
      throw new RuntimeException("b is not a groovyobject");
    }
  }
}

以下Groovy类:

class B {
  def yeah() {
    println "hell yeah"
  }
}

具有以下结果:

$ javac -cp ~/groovy/embeddable/groovy-all-2.1.3.jar:. A.java 
$ java -cp ~/groovy/embeddable/groovy-all-2.1.3.jar:. A
b is a groovyobject
hell yeah