我们如何修改原始Java类的源代码?

时间:2012-01-12 06:06:13

标签: java

大家好,我想知道我是否可以修改和重新编译Java基类?

我想将函数添加到现有类中,并能够调用这些函数。

例如,我想向java.lang.String添加一个函数,重新编译它并将其用于我的项目:

public char[] getInternalValue(){
      return value;
}

我想知道我们该怎么做呢?

3 个答案:

答案 0 :(得分:2)

您所指的是"monkey patching"。它可以在Java中使用,但它不可取,结果可能......非常有趣。您可以下载String类的源代码,将其弹出到JAR中并在bootclasspath前加上:

-Xbootclasspath/p:MonkeyPatchedString.jar

用你自己的内置String类替换它。

关于这个主题here,有一篇有趣的论文。

答案 1 :(得分:2)

如果你这样做,你就会与java.lang.String类和所有类不兼容,依赖于java.lang.String,这是一个非常非常好的想法。

第二个问题可能是许可证。对于自学,这是完全没问题,但如果你发布你的代码(编译或在源代码中),你应该仔细阅读许可条款。

由于String类被声明为final,因此您甚至无法继承String,并实现您的PacerierString,这看起来很有用。但是有很多人会实施他们的小助手,我们会从各地获得很多SpecialString类。

通常的做法是人,写一个类Foo,并添加一个方法

 public Foo toFoo () {
     // some conversion for String representation of Foo
 }

到他们的UniversalToolString。

但是,您可以编写一个包含字符串的包装器。你可能不会将你的Wrapper传递给一个需要String的方法,但是你需要调用它的'toString()'方法,如果它恰好是一个很好的候选者。

   Foo foo = new Foo ("foobar", 42);
   foo.setMagic (foo.toString ().length); 

答案 2 :(得分:1)

不要那样做。

如果你想成为邪恶的,你可以使用反射来访问字符串的字节数组。但是当然不能保证将来这个领域会存在......好吧,它可能会,但需要注意的是。

相关问题