2012-01-12 3 views
1

こんにちは、私はJavaベースクラスを修正して再コンパイルできるかどうか疑問に思っていましたか?元のJavaクラスのソースを変更するにはどうすればよいですか?

既存のクラスに関数を追加し、これらの関数を呼び出せるようにしたいと思います。例えば

、私は、java.lang.Stringに機能を追加し、それを再コンパイルし、私のプロジェクトのためにそれを使用したいと思います:

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

私はどのように我々はそれをやって行くのです不思議でしたか?

+4

既存のクラスを再生するのではなく、独自の実装(ユーティリティクラス)を作成するのは良い方法ではありませんか? –

+1

既存のクラスにメソッドを追加することで何をしようとしていますか?あなたがしようとしていることは、確かに良い解決策があります。 – casablanca

+0

@casablancaたとえば、クラスのプライベートフィールド( 'java.lang.String.value')にアクセスしたいと思っています。 – Pacerier

答えて

2

あなたが言及しているのは"monkey patching"です。 Javaでは可能ですが、それはお勧めできませんし、その結果は...面白いかもしれません。あなたは、StringクラスのソースをダウンロードJARにそれをポップしてブートクラスパスを付加することができます:あなた自身に内蔵されたStringクラスを置き換えるために

-Xbootclasspath/p:MonkeyPatchedString.jar 

非常に興味深い論文がありますhereです。

+0

これは強力です= D – Pacerier

+1

"偉大な力は大きな責任を伴います" - アンクルベン – ninesided

+0

ソースはJDKにあります。 JARをendorsedディレクトリに追加することもできます。 –

1

しないでください。

邪悪になりたい場合は、反射を使用して文字列のバイト配列にアクセスできます。しかしもちろん、その分野が未来に存在することは保証されていません...そうでしょう、それはおそらく、しかし、emptor注意してください。

2

これを行うと、java.lang.Stringクラスとjava.lang.Stringに依存するすべてのクラスとの互換性がなくなります。これは非常にまれなことです。

もう1つ問題がライセンスになる可能性があります。自己学習のためには完全に問題ありませんが、あなたのコードを(コンパイルされた、またはソースで)公開する場合は、前にライセンス条項を注意深く読みます。

Stringクラスはfinal宣言されているので、Stringから継承することもできず、一見すると便利なようなPacerierStringを実装することはできません。しかし、小さなヘルパーを実装した人が非常に多く、どこからでも多くのSpecialStringクラスを取得できます。

一般的な方法は、Fooクラスを書いて、そのUniversalToolStringに方法

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

を追加し、人々だろう。

ただし、文字列を含むWrapperを記述することはできます。 Wrapperをメソッドに渡すことはできません。メソッドにはStringが必要ですが、そのような場合には 'toString()'メソッドを呼び出す必要があります。

Foo foo = new Foo ("foobar", 42); 
    foo.setMagic (foo.toString().length); 
関連する問題