调试步骤将无法在自己的代码上工作:MyClass $ Proxy $ _ $$ _ WeldClientProxy.myMethod()行:不可用

Les*_*ter 5 eclipse jboss-weld jboss7.x

在调试时,我将断点设置为从另一个(自己的)类调用方法的行.在step into我得到一个Source not found在标题编辑器MyClass$Proxy$_$$_WeldClientProxy.myMethod() line: not available中的堆栈跟踪.
只要我带着断点返回班级,我就可以跨过那些.

我使用Eclipse Kepler SR 1,Eclipse Juno SR 2和JBoss AS 7.1.1和7.2也遇到了同样的问题.

ewe*_*nli 6

这是自动生成代码的常见问题.你相信你的一个对象(让我们称之为A)在你的另一个对象上调用一个方法(让我们称之为B),但是框架实际上用一个代理B'代替了你的对象B,代理B'的类是自动生成的.

代理B'与原始对象B具有相同的接口,并最终将调用转发给B.

自动生成的代码会混淆调试器,但如果您盲目地单击"步入" - 没有看到源代码 - 您最终应该再次访问自己的代码.不用说它不方便.

你可以做的是

  1. 在你感兴趣的B类中设置一个断点
  2. 使用"run"而不是"step into"

这应该停留在您感兴趣的方法中.您应该能够在堆栈中看到已调用的代理的自动生成方法.

注意:即使您根本不使用任何框架,也可能会遇到类似的问题.实际上,java编译器(javac)有时会生成合成代码,尤其是匿名类和桥接方法.