1

Javaでカスタムクラスを使用してプラットフォームからクラスを隠すことは可能ですか? たとえば、カスタム java.lang.String またはカスタム java.lang.StringBuffer を作成するには? C# /nostdlib にシステム名前空間全体を再定義できるオプションがあることを最近発見したため、質問しています。Java に同様のものがあるかどうか疑問に思っていました。

C# の /nostdlib はコンパイラ オプションであり、実行時に考慮されるものではないことに注意してください。

4

4 に答える 4

1

java.langクラス、またはその他の「システム」クラスを置き換えるには、ブートクラスパスを変更する必要があります。コマンドラインからJavaを実行する場合、これは簡単に実行できますが、ある種の「環境」で実行する場合、その変更を行うことが許可されない場合があります。

さらに、多くのjava.lang et alクラスにはネイティブメソッドの実装があり、独自の置換を提供するか、既存の実装を再利用するように何らかの方法で調整する必要があります。

于 2012-11-24T05:37:05.787 に答える
1

ライブラリ クラスには独自のクラスを使用できます。開始時に-bootclasspathを定義して、独自のクラス ライブラリを定義できます。

一部のクラスは実行中の VM に強くバインドされているため、これは簡単な作業ではありません (例: class ) String。このような場合は、JLS を確認する必要があります。

于 2012-11-24T09:48:01.820 に答える
1

標準ライブラリを変更したり、独自のライブラリを個人用に置き換えることはできますが、Oracle はこれをサポートしておらず、変更したバージョンを他の人に配布することを許可していません。クラスを検索する場所を JVM に指示するためのさまざまなコマンドラインおよび構成オプションがあります。ブートストラップ クラスを置き換えるのは難しいですが、可能です。

完全にゼロから独自のバージョンを作成するのは難しいことに注意してください。これは、いくつかのクラス (ObjectおよびClass少なくとも) が必然的に JVM 実装に非常に強く結び付けられているためです。簡単にするために、ネイティブ コードを使用するすべてのクラスを同じにしておくことをお勧めします。

これはクラス シャドウイングとは異なることに注意してください。これは純粋にコンパイル時の概念であり、通常はインポートが原因で複数の識別子が競合する場合に発生します (java.lang.*は暗黙的にインポートされ、それについては何もできません)。これらの競合は、通常、状況に応じていずれかの可能性を黙って使用するか、コンパイル エラーを発生させることによって解決されます (詳細については、JLS を参照してください)。

于 2012-11-24T04:40:38.313 に答える
0

Sun/Oracle は、JSE/JDK のライセンスによってそれを許可していません。しかし、 Java.lang.* パッケージのメソッドを追加したり上書きしたりするなど、Groovyが驚くべきことを実行できることを最近知りました。

Groovy は Java/JVM に基づいているため、1 つのアプリケーション内でそれらを簡単に組み合わせることができます。

于 2012-11-24T08:20:42.023 に答える