2

我正在使用 Eclipse 进行调试,并得到了一个匿名实例化接口的参数。有没有办法找出它是在哪里创建的?

4

4 回答 4

4

在调试时,您可以在 Debug 透视图中看到实际的堆栈跟踪,只需从执行在断点处停止的位置向下单击跟踪,直到您到达创建匿名类实例的方法。

在此处输入图像描述

这是返回实例的调用

在此处输入图像描述

点击F3定位方法。

在此处输入图像描述

于 2013-11-08T17:12:22.300 回答
3

除非您从应用程序开始逐步调试,否则没有直接的方法可以找出使用 Eclipse 实例化的位置。

我发现实现这一目标的最佳方法是new "yourInterface"() {在所有 *.java 文件中进行文件搜索(ctrl+h,文件搜索选项卡)并搜索 ,。这将找到您在代码中实例化该接口的所有位置。

如果您能够使用工作集缩小范围,这将简化查找哪些找到的位置是您正在寻找的位置。

于 2013-11-08T16:49:16.043 回答
0

null您可以临时修改您的代码以在您获取它的地方使用任何参数(即)调用此接口,并执行一个步骤。

更新

java.lang.reflect.Type是在 JVM 中加载的基本接口实例。在大多数情况下,找到它们被实例化的这个地方(很可能是本机代码)不会给出任何结果。

此类型用于描述字段、方法、类等中的泛型。即用于字段声明

List<? extends Foo> fooList = new ArrayList<Foo>();

它对应于<? extends Foo>。要查找此声明,您可能需要:

  • 调用toString()此接口的调试器并在您的代码中搜索出现的情况
  • 检查此Type实例以了解或向我们展示更多信息
  • 使用调试器找出反射是如何得到的(即Field.getTypeMethod.getGenericParameterTypes()
于 2013-11-08T16:59:36.803 回答
0

我没有进一步跟踪这个问题,因为我使用了其他解决方案。但我帮助的是这段代码,其中变量“genericType”是匿名实例化接口:

// Ensure that we're handling only List<MediaEntity> objects.
boolean isWritable;
if (List.class.isAssignableFrom(type) && genericType instanceof ParameterizedType) {
    ParameterizedType parameterizedType = (ParameterizedType) genericType;
    Type[] actualTypeArgs = (parameterizedType.getActualTypeArguments());
    isWritable = (actualTypeArgs.length == 1 && actualTypeArgs[0].equals(MediaEntity.class));
} else {
    isWritable = false;
}
于 2013-11-11T13:42:49.393 回答