2

我想实现自己的 String 类,并在使用双引号时让 Java 使用它。
它应该看起来像这样:MyString s = "foo"并且 java.lang.String 不应该被实例化。

不接触编译器有可能吗?
怎么做?

我问的原因是我需要程序中的字符串需要验证最坏情况的执行时间。为了验证它,所有循环都必须有界(边界在注释中指定)。此外,为了方便起见,我希望能够使用双引号,因为写作MyString s = new MyString({'f','o','o'})确实会降低可读性。

4

4 回答 4

3

不接触编译器是不可能的。

甚至不可能对 String 进行子类化。(你只能提供你自己的实现java.lang.ChareSequence,但这不会有太大帮助。)

于 2011-01-18T10:04:16.290 回答
3

您可以替换 String 类。获取 String 的源代码,更改它以保持所有方法签名相同,编译它并将其添加到您的引导类路径中。注意:这将替换所有字符串,而不仅仅是代码中的字符串。它也可能不符合您的使用许可。;)

如果您担心可读性,您可以创建一个辅助方法

MyString s = s("Hello");

如果您只想减慢应用程序的速度,您可以做很多事情,例如;

  • 使用你能找到的最慢的机器。ebay上有很多便宜的。
  • 禁用 JIT。
  • 启用调试。
  • 启用分析并跟踪每个方法调用和对象创建。
于 2011-01-18T10:25:48.270 回答
2

您可以寻找真正复杂的解决方案,例如在运行时修改字节码以在任何使用 String 的地方使用 MyString,例如使用 ASM 之类的框架,但祝您好运!

http://asm.ow2.org/

尝试通过另一种方式获得相同的结果可能是一个更好的主意......

于 2011-01-18T10:06:25.147 回答
2

Stringer 文字只实例化一次,所以不用担心时间成本。

MyString s = new MyString("foo")

这对你的目的来说很好。只创建了一个String实例"foo"。(即使多个源文件包含"foo"文字)。这几乎就像

static private final String $foo = JVM.findOrCreateString('f','o','o');
...
MyString s = new MyString($foo);
于 2011-01-18T10:26:37.263 回答