【问题标题】:Groovy Java cross compilation instanceofGroovy Java 交叉编译实例
【发布时间】:2013-08-27 18:56:26
【问题描述】:

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

由于每个 Groovy 类的编译过程(包括 Java 类存根生成),这看起来是不可能的。因此,带有 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 代码方法所需的 ech 的 Java 端接口。

附:最后一句是关于这样的解决方案。

在 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 { ... }

【问题讨论】:

  • 再想一想,你在用 eclipse 吗?
  • @Will 不,我使用的是 IntelliJ IDEA CE 12.1.4,带有 groovy 2.1.3 和 1.6 JDK。 MacBook。

标签: java groovy casting instanceof


【解决方案1】:

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

【讨论】:

  • 哦,看起来很有趣。如果我在 Java 端创建一个 Groovy 对象,我将得到与您相同的结果。一切都会正常工作。如果我在 Groovy 端创建对象,然后将其传递给 Java 代码以检查它的类,我将从我的帖子中获得结果。 node 是在 Java 端创建的 ModelNode 对象。 node.getClass() = {java.lang.Class@3137}"class ModelNode"; ModelNode.class = {java.lang.Class@3137}"class ModelNode"; component.getClass() = {java.lang.Class@3099}"class ModelNode"; node instanceof ModelNode = true;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多