Java调试器查找对象的实例化位置

时间:2013-11-08 16:35:16

标签: java eclipse debugging anonymous-types

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

4 个答案:

答案 0 :(得分:3)

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

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

如果你能够通过工作集缩小范围,那么将简化查找找到的地点的位置。

答案 1 :(得分:3)

在调试时,您可以在Debug透视图中看到实际的堆栈跟踪,只需在执行停止处的断点处单击返回跟踪,直到找到创建匿名类实例的方法。 / p>

enter image description here

这是返回实例的调用

enter image description here

点击F3找到方法。

enter image description here

答案 2 :(得分:0)

您可以暂时修改代码,使用任何参数(例如null)调用此接口,然后再进行操作。

<强>更新

java.lang.reflect.Type是在JVM中加载的基本接口实例。

在大多数情况下将它们实例化到这个地方(很可能是本机代码)

此类型用于描述字段,方法,类等中的泛型。对于现场声明

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

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

  • 在此界面的调试器中调用toString()并在代码中搜索是否出现
  • 检查此Type实例查找或向我们展示更多信息
  • 使用调试器了解它是如何通过反射得到的(即Field.getTypeMethod.getGenericParameterTypes()

答案 3 :(得分: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;
}