2009-06-08 64 views
1

我目前正在为我的Java项目开发调试/错误处理工具。这是一个长效的方法,但是有没有办法打印出发送到方法中的参数的值?有没有办法查看发送到Java中的方法的参数的值?

调用该方法时,JVM必须存储它们。无论如何,我可以抓住这些价值观?

我的首要目标就是叫我自己printArguments()方法,它应该 - 不知何故 - 打印出来的参数,不管我是什么方法

任何人有任何想法如何,我可以解决这个问题?或者也许也许我可以访问其他类似的信息?我想在某个时间获得尽可能多的信息,例如变量。

任何意见将不胜感激! :)

回答

1

您将需要详细阐述一点。你是从Java源代码构建你自己的编译器吗?你在建立你自己的字节码解释器吗?你想钩入现有的字节码解释器吗?答案完全取决于你所关注的阶段。

如果您有权访问Java源代码,那么面向方面的编程可能适合您。您可以使用它将printArguments调用自动编织到每个常规方法调用中。

3

我目前正在为我的Java项目开发调试/错误处理工具。

您是使用JPDA?如果是这样,你可能会得到一个method entry event,得到event's thread并从当前stack frame读取参数。如果您不熟悉它,请参阅此JPDA demo blog post

如果你想避免在调试模式下运行,那么(如其他人所说)AOP是一个很好的解决方案。您可以使用instrumentation和/或byte code manipulation推出自己的解决方案,但这是一种更为复杂的方法。

0

我可能已经有点blury。

这是一个标准的J2SE项目。使用标准的编译器和运行时,没有什么奇特的。我想尽可能多地使用J2SE库,而不是将新的库包含到项目中,或者使用外部工具(如Eclipse),因为它将是dist。到非开发机器。

+0

Stackoverflow不是一个线程论坛。所以请不要将后续作为答案。请张贴他们作为对推荐答案的评论。 – guerda 2009-06-08 13:13:24

0

我现在读了一大堆,但我仍然不确定要使用什么。

Visual VM看起来像一个外部工具,我不感兴趣。为了使用Proxy,我必须用它包装项目中的所有类,这是我不感兴趣的。

归结为JPDA和AOP,都似乎复杂,然后他们应该:)我不知道这两个我可以在同一个运行时使用更容易,没有在调试模式下启动应用程序或创建一个用一种新的OAP语言写了一些东西。

我希望只是一个简单的方法来转储方法参数,而不知道什么方法,参数或类型的数量。

理论上,由于反射,我可以获得方法名称和参数类型。但不是他们的价值观。

任何回应将有所帮助。

0

如果你想只依靠JDK库(1.4+),我能想到的将记录添加到您的所有方法,例如唯一的东西,

(我使用的是共享日志记录的语法,因为我不熟悉Java日志记录细节)

public void foo(String bar) { 
    log.debug("entering foo(" + bar + ")"); 
    //... 
} 
+0

这就是如果你真的知道的论点。我想自动解决这个问题。 – corgrath 2009-06-08 13:06:45

1

对原始问题的简短回答是否定的。一个方法的参数到达栈中的槽,但是这个方法可以自由地使用这些槽来存储其他的东西,所以你不能在后面知道这些槽的内容是参数还是别的东西。这只是谈论在字节码中表达的方式 - 在本地代码中实际发生的情况可能完全不同。

在任何情况下,都无法反射性地访问java中的局部变量,所以即使参数被保留下来,也无法得到它们。

JPDA是非侵入式访问方法参数的唯一方法,恐怕。

+0

感谢您的评论。我想看看JPDA :) – corgrath 2009-06-08 14:49:54

1
void PrintValues(Object... params){ 
    for(object o : params){ 
     System.out.println(o.toString()); 
    } 
} 

然后,在任何方法中,你都知道你的参数可以将它们传递给PrintValues。

void SomeMethod(String p1, int p2, StringBuilder p3){ 
    PrintValues(p1, p2, p3); 
} 

我是否过于简单化的要求?听起来像你想要的是非常适合AOP /反射,但如果你对他们死了,这可能会做一些你想要的。

+0

感谢您的评论。正如我写给杰克·莱,这需要我指定参数。这是一个很好的解决方案,但我宁愿开发一些东西,所以我只需要调用PrintValues(),它会自动循环访问参数:) – corgrath 2009-06-08 13:26:18

0

我不确定你的要求,但你看看BTrace。你可以做到你想要的东西。

此外,您可以将您的调试/错误处理工具基于BTrace - 提供一组特定于您的应用程序的脚本,然后以特别的方式运行它们。 GalssFish v3做了类似的事情。