2013-08-27 4 views
3

Я ищу способ проверить с Java, что некоторый объект является экземпляром некоторого класса Groovy.Groovy Java cross compilation instanceof

Похоже, что это невозможно из-за процесса компиляции, включая генерацию заглушек класса Java, для каждого класса Groovy. Итак, instanceof с классом Groovy вернет false.

В окне «Часы» я могу проверить его.

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

Очевидно, что есть два разных класса. И Java видит сгенерированный. Итак, я ищу хороший способ проверить какой-либо объект на класс Groovy.

I'v попробовал метод reflexion и getSuperclass(), и похоже, что существуют два совершенно разных класса, полученных из одного и того же суперкласса.

component.getClass().getSuperclass() = {[email protected]}"class javax.swing.tree.DefaultMutableTreeNode" 
ModelNode.class.getSuperclass() = {[email protected]}"class javax.swing.tree.DefaultMutableTreeNode" 

Кроме того я не могу бросить ничего после InstanceOf, в связи с тем же причинам. Итак, я должен делать что-л. неправильно.

Есть ли способ использования объектов Groovy в Java. Без интерфейса Java-интерфейса для ech, необходимого из 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

О, это выглядит интересно. Если я создаю объект Groovy на стороне Java, я получу те же результаты, что и ваши. Все будет работать правильно. Если я создаю объект на стороне Groovy, то передайте его в Java-код, чтобы проверить его класс, я получу результаты из своего сообщения. ** node ** - объект ModelNode, созданный на стороне Java. 'node.getClass() = {[email protected]}" class ModelNode "'; 'ModelNode.class = {[email protected]}" class ModelNode "'; 'component.getClass() = {[email protected]}" class ModelNode "'; 'node instanceof ModelNode = true'; – Seagull