我正在使用 Eclipse 进行调试,并得到了一个匿名实例化接口的参数。有没有办法找出它是在哪里创建的?
问问题
3118 次
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.getType
或Method.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 回答