2013-08-27 98 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