繁体   English   中英

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

[英]Java debugger find where an object was instantiated

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

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

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

如果您能够通过工作集来缩小范围,那么将简化查找所要查找的地点的过程。

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

在此处输入图片说明

这是返回实例的调用

在此处输入图片说明

F3定位方法。

在此处输入图片说明

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

UPDATE

java.lang.reflect.Type是一个基本接口实例,已在JVM中加载。 在大多数情况下,将其实例化的位置(最有可能是本机代码)放置在该位置。

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

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

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

  • 在调试器中为此接口调用toString()并在代码中搜索是否发生
  • 检查此Type实例以查找或向我们显示更多信息
  • 使用调试器来找出它如何被使用反射得到(即Field.getTypeMethod.getGenericParameterTypes()

我没有进一步追踪这个问题,因为我使用了其他解决方案。 但是我帮助的是这段代码,其中的变量“ 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM