【问题标题】:classOf T instead of T$ for Java library that does reflection用于进行反射的 Java 库的 classOf T 而不是 T$
【发布时间】:2021-05-18 12:14:50
【问题描述】:

我正在将 Scala 与 Java 库一起使用,该库期望通过 public static void main(java.lang.String[]) 传递一个类,以便它可以通过反射运行调用它以进行集成测试。

object RestServer {
    def main(args: Array[String]): Unit = { /* run the server */ }
}

由于this answer to another question 中描述的行为,它被编译为两个类。

public final class com.example.RestServer$ {
  public static final com.example.RestServer$ MODULE$;
  public static {};
  public void main(java.lang.String[]);
}

public final class com.example.RestServer {
  public static void main(java.lang.String[]);
}

当我把课程传给图书馆时

@IntegrationTest(main = classOf[RestServer.type])
class MyTests extends RapidoidIntegrationTest { }

我实际上传递的是 object 单例实例 (RestServer$),而不是具有 static void main() 方法的 RestServer 类。

这不会有问题,除非库在调用它之前验证它正在调用的方法是 publicstatic 吗?

我怎样才能获得RestServer 类呢?

【问题讨论】:

  • @MateuszKubuszok classOf[RestServer] 无法编译。 not found: type RestServer
  • 是否可以选择定义一个空的伴随类RestServer?否则我认为你被卡住了。
  • @Jasper-M 这是一个选项,是的,但我不明白这有什么帮助。我更像是一个 CLR,而不是一个 JVM。
  • 那么你可以使用classOf[RestServer],因为这样RestServer类“存在”到Scala。

标签: java scala reflection


【解决方案1】:

如果您可以控制RestServer 源文件,则可以添加一个空的伴随类。

object RestServer {
    def main(args: Array[String]): Unit = { /* run the server */ }
}

class RestServer

这样 Scala 会识别出类 RestServer 存在,因此 classOf[RestServer] 将编译并为您提供包含静态方法的类。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多