2013-08-27 53 views
3

我正在寻找一种方法来检查Java,某些对象是一些Groovy类的实例。Groovy Java交叉编译instanceof

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

在手表窗口我可以测试它。

ModelNode.class = {[email protected]}"class ModelNode" 
component.getClass() = {[email protected]}"class ModelNode" 
component instanceof ModelNode = false 

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

我试过反射和getSuperclass()方法,它看起来像有两个完全不同的类,派生自同一个超类。

component.getClass().getSuperclass() = {[email protected]}"class javax.swing.tree.DefaultMutableTreeNode" 
ModelNode.class.getSuperclass() = {[email protected]}"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 { ... } 
+0

退一步讲,您使用蚀? – Will

+0

@是的,我正在使用IntelliJ IDEA CE 12.1.4,使用groovy 2.1.3和1.6 JDK。的MacBook。 – Seagull

回答

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 
+1

哦,这看起来很有趣。 如果我在Java端创建一个Groovy对象,我会得到和你一样的结果。所有将正常工作。 如果我在Groovy方面创建对象,然后将它传递给Java代码来检查它的类,我将从我的帖子中得到结果。 ** node **是在Java端创建的ModelNode对象。 'node.getClass()= {[email protected]}“class ModelNode”'; 'ModelNode.class = {[email protected]}“class ModelNode”'; 'component.getClass()= {[email protected]}“class ModelNode”'; '节点instanceof ModelNode = true'; – Seagull