[英]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.getType
或Method.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.