2011-03-21 58 views
0

所以基本上我只是想通过尝试一个新的方法来调试几个简单的脚本,我过去成功地通过挂钩URL.class(使用jdk的源代码和重新绑定),但是我意识到如何在字符串之前打印出字符串?如何劫持String.class

我希望能够写入文件或打印出经过字符串类的任何字符串,但是如何在字符串类本身内创建管道方法?

I.e.一个char数组被传递到字符串中,我如何获取它,将其作为一个字符串并将其发送到字符串类中的print out命令?如果我太模糊,我会举几个例子。

+2

如果你真的想这样做,你不能添加这行作为String类中每个构造函数的最后一行吗?的System.out.println(this.toString()); – RoflcoptrException 2011-03-22 00:07:12

+0

哦,我的上帝,我甚至没有想到那么简单,我试图通过自己的方法来管理每个输出,我会在一秒钟之内尝试。谢谢。 – exclu 2011-03-22 00:08:13

+0

也许这太简单了,但System.out.print(char c)一遍又一遍地重复你的假String类中的字符?您始终可以打印原始值。 – jbrookover 2011-03-22 00:12:30

回答

2

IMO,调整Java标准类的实现是一个非常糟糕的主意,即使您只是在尝试和调试某些东西。问题是你可以非常糟糕地破坏事物。

例如,@Roflcoptr建议您为每个String构造函数添加一个System.out.println(...)。但是如果PrintStream.println调用由于某种原因试图构造一个字符串会发生什么?如果在初始化流对象之前尝试构造String ...,那么在JVM自举期间会发生什么?

我不是说它不起作用。我不是说你不能使它工作。我是am说这样的骇客很容易以惊人而可怕的方式失败。

我的建议是找到另一种调试/诊断问题的方法。例如,在相关的String构造函数上设置一个断点。

+0

这两个问题都很容易解决:1.如果'println'真的做到了,可以使用ThreadLocal或StackTrace检查来避免无限递归。 2.在程序开始时使用全局变量集以避免引导期间出现问题。也就是说,我完全同意你的建议。 – maaartinus 2011-03-22 03:13:21

+1

在某些情况下,堆栈跟踪捕获很可能会创建字符串。使用threadlocals或全局可能会更改类依赖关系,从而在引导过程中导致不同的类加载/初始化顺序...并破坏其他内容。 – 2011-03-22 03:53:36

1

从JDK源代码重新编译的替代方法可能是使用aspect-oriented programming,它允许您向以前编译的类添加或替换行为。 AspectJ是支持面向方面编程的Java工具之一。

+1

AOP很糟糕。 AOP是针对一般问题的,你不能将它用于String之类的东西,而是要求真正的麻烦。如果每次使用/构造一个拦截器运行一个字符串,你的系统会变得难以忍受。拦截器会做什么?打印一些意味着另一个字符串被创建... – 2011-03-22 01:21:38

+0

这个问题是关于*调试*,其中预期较慢的行为。您对生产系统中AOP的个人反感并不重要。假设追踪会创建一个新的字符串不一定是正确的。 – 2011-03-22 13:11:43