Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何劫持String.class_Java - Fatal编程技术网

Java 如何劫持String.class

Java 如何劫持String.class,java,Java,因此,基本上我只想通过尝试一种新方法来调试几个简单的脚本,过去我通过挂接URL.class(使用来自jdk的源代码并重新编译)获得了成功,但是我意识到如何在字符串还未成为字符串之前打印出字符串 我希望能够写入文件或打印通过string类的任何字符串,但是当我在string类本身中时,如何创建管道方法呢 也就是说,一个char数组被传递到字符串中,我如何获取它,使其成为字符串,并从string类中将其发送到print out命令?如果我太含糊,我将提供一些示例。从JDK源代码重新编译的替代方法可能

因此,基本上我只想通过尝试一种新方法来调试几个简单的脚本,过去我通过挂接URL.class(使用来自jdk的源代码并重新编译)获得了成功,但是我意识到如何在字符串还未成为字符串之前打印出字符串

我希望能够写入文件或打印通过string类的任何字符串,但是当我在string类本身中时,如何创建管道方法呢


也就是说,一个char数组被传递到字符串中,我如何获取它,使其成为字符串,并从string类中将其发送到print out命令?如果我太含糊,我将提供一些示例。

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

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

IMO,调整Java标准类的实现是一个非常糟糕的主意,即使您这样做只是为了尝试和调试一些东西。问题是你会把东西弄坏得很厉害

例如,@Roflcoptr建议您向每个
字符串
构造函数添加
System.out.println(…)
。但是如果由于某种原因,
PrintStream.println
调用试图构造一个字符串,会发生什么呢?如果有人试图构造字符串,JVM引导过程中会发生什么。。。在初始化
系统。*
流对象之前

我并不是说这行不通。我不是说你做不到。我是说像这样的黑客很容易以惊人和可怕的方式失败


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

IMO,调整Java标准类的实现是一个非常糟糕的主意,即使您只是为了尝试和调试某些东西。问题是你会把东西弄坏得很厉害

例如,@Roflcoptr建议您向每个
字符串
构造函数添加
System.out.println(…)
。但是如果由于某种原因,
PrintStream.println
调用试图构造一个字符串,会发生什么呢?如果有人试图构造字符串,JVM引导过程中会发生什么。。。在初始化
系统。*
流对象之前

我并不是说这行不通。我不是说你做不到。我是说像这样的黑客很容易以惊人和可怕的方式失败


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

如果您真的想这样做,是否可以将此行添加为String类中每个构造函数的最后一行?System.out.println(this.toString());哦,我的天,我甚至没有想到这么简单的事情,我试图通过它自己的方法来传递每个输出,我马上就要尝试这个。谢谢。也许这太简单了,但是System.out.print(char c)会在假字符串类中的字符上反复出现吗?您始终可以打印基本值。看起来上面已经回答过了,但是你也可以1)在那里放一个断点并使用调试器,或者2)通过使用-Xbootclasspath非标准java选项指定你自己的来替换java.lang.String类。如果你真的想这样做,你能不能将这一行添加为String类中每个构造函数的最后一行?System.out.println(this.toString());哦,我的天,我甚至没有想到这么简单的事情,我试图通过它自己的方法来传递每个输出,我马上就要尝试这个。谢谢。也许这太简单了,但是System.out.print(char c)会在假字符串类中的字符上反复出现吗?您始终可以打印原语值。看起来上面已经给出了答案,但是您也可以1)在那里放置一个断点并使用调试器,或者2)通过使用-Xbootclasspath非标准java选项指定自己的类来替换java.lang.String类。AOP很糟糕。AOP是针对一般问题的,你不能用它来处理像字符串这样的东西,你会自找麻烦。如果每次使用/构造字符串时都运行拦截器,那么您的系统将变得极其缓慢。那么拦截器会做什么呢?打印意味着创建了另一个字符串的内容…这个问题是关于调试的,在调试中,预期会出现较慢的行为。您个人对生产系统中AOP的反感与此无关。跟踪将创建一个新字符串的假设不一定是真的。AOP糟透了。AOP是针对一般问题的,你不能用它来处理像字符串这样的东西,你会自找麻烦。如果每次使用/构造字符串时都运行拦截器,那么您的系统将变得极其缓慢。那么拦截器会做什么呢?打印意味着创建了另一个字符串的内容…这个问题是关于调试的,在调试中,预期会出现较慢的行为。您个人对生产系统中AOP的反感与此无关。跟踪将创建新字符串的假设不一定成立。这两个问题都很容易解决:1。如果
println
真的这样做了,您可以使用ThreadLocal或StackTrace检查来避免无限递归。2.当程序开始避免在引导过程中出现问题时,请使用全局变量集。也就是说,我完全同意你的建议。堆栈跟踪捕获在某些情况下可能会创建字符串。使用threadlocals或global可能会更改类依赖关系,从而在引导过程中导致不同的类加载/初始化顺序。。。这两个问题都很容易解决:1。如果