问题标签 [scala-reflect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
361 浏览

scala - 像 $read 和 $iw 这样的奇怪名称在具体化表达式中做了什么?

以下是我的 Scala 提示中的一些片段。我导入反射 API 并尝试具体化一些表达式,如此处的文档中所述。

我没想到会在第二个中看到这些符号$line4,$read和。$iw它们是什么,它们为什么在那里?

0 投票
1 回答
234 浏览

scala - Scala 解析器剪切最后一个括号

结果是:

我期望:

}如果我使用 Tree 对象中的位置,则缺少最后一个括号(和行尾):text.substring(t.pos.start, t.pos.end)

任何建议如何从 scala.reflect.api.Trees#Tree 对象中提取所有文本?

更新

受影响的 Scala 版本:

  • 2.10.6 - sbt 0.13.x 需要
  • 2.11.8
  • 2.12.7

对于 scala 2.10.6/2.12.7 结果与上述输出相同。

将项目添加到 github

用于搜索解决方案的示例项目

0 投票
1 回答
143 浏览

scala - 使用 Scala 反射 API 运行时的实例名称

让我们从以下示例开始:

使用 Scala 反射 API(或任何其他方法),如何在运行时获取类实例的名称?如何从 AST 获取这些信息?

同样的问题,但对于 Java:Java 反射:如何获取变量的名称?

0 投票
1 回答
474 浏览

scala - 可以在 Scala 中找到参数类型方法返回类型,其中参数是原始类型?

假设我有:

我打印出Scala中每个方法的返回类型,如下所示:

所以...我可以确定listX的元素类型是X,但是有没有办法通过反射确定listPrimitive的元素类型实际上是java.lang.Integer?...

注意。由于 JVM 类型擦除,这似乎不是问题,因为我可以找到 List 的 types 参数。看起来scala编译器丢弃了这个类型信息IFF参数类型是 java.lang.[numbers] 。

更新:

由于以下实验,我怀疑这种类型的信息是可用的。假设我定义:

X.class 是通过 jar 导入的。完整的类型信息必须在 X.class 中可用,这样这种情况才能正确编译失败。

更新2:

想象一下,您正在编写 Java 序列化库的 scala 扩展。你需要实现一个:

需要根据以下情况执行不同操作的函数:

我的问题是我只会看到:

因为 clz 作为 clz.getMethods()(i).getGenericReturnType() 提供给这个函数。

从 clz:Class[_] 开始,如何恢复丢失的元素类型信息?

我不清楚 TypeToken 会帮助我,因为它的用途:

要求我提供 T (即在编译时)。

因此,解决方案的一条途径...给定一些 clz:Class[_],我可以确定其方法返回类型的 TypeTokens 吗?显然,这是可能的,因为此信息必须(某处)包含在 .class 文件中,以便 scala 编译器正确生成类型不匹配错误(见上文)。

0 投票
2 回答
1118 浏览

scala - 如何在scala中获取reflect.runtime.universe.Type的类型参数?

假设我得到一个表示 List[Int] 的类型:

如何从 reflect.runtime.universe.Type (显然知道类型参数 scala.Int)到实际的类型参数?

我看到 TypeSymbol 有一个参数

一些实验..

0 投票
2 回答
882 浏览

scala - 如何使用 scala 反射按返回类型过滤方法?

我正在尝试测试方法的返回类型是否与提供的类型完全匹配。

不知何故,我发现了两个不相等的字符串类型。

产量...

如何按返回类型过滤类的方法?(如果我可以测试返回类型的相等性似乎非常困难)。

斯卡拉 2.10

更新:

我不能进入 Java 反射宇宙,因为这种删除了泛型的类型信息,如 List[Int](变成 List[Object] 是 Java 领域,它们实际上是 List[java.lang.Integer])。我需要我的匹配来注意 scala 类型 Universe 保留的通用参数信息。

0 投票
1 回答
465 浏览

scala - 有没有办法在宏上下文中获取 ClassSymbol 的直接父级?

我试图获得 ClassSymbol 的直接超类/特征。该方法baseClasses()对我不起作用,因为它还包括 super super.. 类型。

和实际上对于我的用例来说已经足够了java.lang.Class.getSuperclass(),但是在宏观环境中java.lang.Class.getInterfaces()我找不到从ClassSymbol到的方法!java.lang.Class

0 投票
1 回答
79 浏览

scala - 在 Scala 中查找所有非综合方法/函数的类型签名

我正在尝试找到一种方法来获取 Scala 编译器的符号表 (?) 并将所有类型信息转储到特定 SBT 项目中的方法/函数中。我目前的方向是编译器插件,在typer阶段之后立即连接到它。

闲逛了一下,我正在看着根镜并检查info.decls它的场,大致如下:

它转储了很多东西,但是..我仍然得到了很多奇怪的输出,比如class anonfun$reduceUnordered$1 extends ;

想知道我是否朝着正确的方向前进,如果是这样,我应该更多地关注什么才能获得项目中方法的类型签名?

0 投票
1 回答
611 浏览

scala - 为什么 ClassTag 的方法 runtimeClass 会返回通配符类?

a的runtimeClass方法ClassTag[T]返回 a Class[_]。我希望它返回 a Class[T],因为我们知道ClassTag[T]代表 的(运行时)类T

为什么它返回“任何” Class?这有根本原因吗?

0 投票
3 回答
461 浏览

scala - 如果 Actor 存在,则动态加载它

我有以下代码

但是,我想动态加载演员,如果它在那里有几个原因:

  1. 它可能不在类路径上,所以我必须询问类加载器是否存在。
  2. 即使它在类路径中,出于配置原因,我也可能不想加载它。
  3. RestEndpoint 在另一个 JAR 文件中,该文件已经依赖于这个 JAR 文件,所以我不能有循环依赖。

是否有一些“简单”的方法可以反思性地做到这一点?请不要指向我关于 Scala 反射的文档,因为那里没有什么容易的。如果有 Scala Reflection for Dummies 讨论,我将不胜感激。

一个工作示例将不胜感激。