4

Objectpackageに name のクラスを作成しましたjava.lang。別のパッケージでMainクラスを作成しました。Main クラスの main メソッドで、new Main()その後にドットを書いて配置するとequals()wait()などは表示されません。つまり、実際の Object クラスのメソッドです。

私の質問は、Object という名前のクラス (特に java.lang パッケージを使用) を作成することは許可されるべきではないと思いませんか? オブジェクトクラスはデフォルトですべてのクラスに継承されるため、私の場合、オブジェクトクラスのクラス名とパッケージ名は実際のオブジェクトクラスのクラス名とパッケージ名と同じであるため、定義したクラスは実際のオブジェクトクラスではなく自分のクラスを自動的に継承します。

4

3 に答える 3

3

これはかなり自由回答形式の質問です。

許可する必要がありますか?自分が何をしているのかわかっているなら、夢中になってみてはいかがでしょうか。

理論的には多少危険なことには同意しますが、誰かが誤ってこれを行う方法がわかりません。誰かが実際に何らかの理由で Object クラス全体を再定義したい場合、たとえば学術的な場合は、自己責任で行うことができます。

自分の膝に矢を放つことを完全に防ぐことのできる言語はありません。

于 2012-08-16T12:06:16.370 に答える
0

書いても役に立たないことを確認できます(少なくとも通常のJavaクラスローディングでは)java.langのものはシステムクラスローダーによってすでにロードされており、オブジェクトクラスが選択されて呼び出されることはないため、優先されますカスタム メソッドは実行時エラーのみを引き起こします (java.lang.NoSuchMethodError)

しかし、カスタム クラス ローダーを使用し、その loadClass メソッドをオーバーライドして、クラス バイトを明示的にロードするが、親クラスローダーでルックアップを行わない場合の動作については確信が持てません。在宅ワークかもしれません:)

于 2012-08-16T12:32:45.260 に答える
0

私はこのトリック (サードパーティの同じパッケージとクラス名をクラスパスに持つ) を使用して、サードパーティのライブラリをまとめられない場合にそれらの機能をオーバーライドすることがよくあります。
いずれにしても、クライアント プログラム (アプリケーション) をロードする前に、すべてのシステム クラスを jvm にロードする必要があります。, コンパイラはClassLoaderすべてのクラスをあまり気にしないため、それを許可するだけですが、実行時にJVMクラスローダーはこれらのことを考慮します. デフォルトのソースコードClassLoader(oracle jdk)を見ると、パッケージを開始してはならないというチェックがあることがわかりますjava.

private ProtectionDomain preDefineClass(String name,
                        ProtectionDomain protectionDomain)
    {
    ...
    if ((name != null) && name.startsWith("java.")) {
        throw new SecurityException("Prohibited package name: " +
                    name.substring(0, name.lastIndexOf('.')));
    }
...
}

のような有名なバイトコード計測ツールでも、javaassistこの種の動作を制限し、クラスが計測可能かどうかをチェックしInstrumentation.isModifiableClassます。
最後に、それはすべて実装に依存しClassLoader、仕様に固執する必要があるため、クラスパスからロードまでのクラスの順序を考慮する必要があります。

于 2012-08-16T13:37:01.457 に答える