ボトムラインは、はい、できます。内部クラスの名前を変更できるので、javac
によって割り当てられた元の名前よりも短くなります。
$
文字を使用して内部クラスを示すために、The Java Language SpecificationとThe Java Virtual Machine Specificationを検索していましたが、参照できませんでした。理由は、それは本当に問題ではないということです。
ケースとポイント:ここでは
class A {
class B {
class C {}
}
A() {
new B().new C();
}
public static void main(String[] s){
new A();
}
}
、我々は内部クラスを入れ子にしています。コンパイルされたとき、私たちは、次のファイルを入手:
A.class
A$B.class
A$B$C.class
は、ここでは簡単な実験です:
- は
A.class
ファイルを開き、A$B$C
への参照を変更し、ABCDE
に変更します。
A$B$C.class
の名前をABCDE.class
に変更します。
ABCDE.class
を開き、参照をABCDE
に変更します。
- 実行
java A
、実行されているかどうかを確認してください。
注:識別子の長さの変化がclass
ファイル形式をマングルているようだ、とエラーの原因となりますので、A$B$C
がABCDE
に変更された理由があります。技術的な説明はこの記事の最後にあります。
結果?できます。
理由はclass
ファイルにあります。ここでは、元A.class
の解体、および関連部分のみだ:
Compiled from "A.java"
class A extends java.lang.Object
SourceFile: "A.java"
InnerClass:
#10= #3 of #7; //B=class A$B of class A
#22= #2 of #3; //C=class A$B$C of class A$B
// ... snip ... //
const #2 = class #21; // A$B$C
// ... snip ... //
const #21 = Asciz A$B$C;
// ... snip ...//
が判明し、内部クラスの名前は、定数プールに名前だけです。 A.class
の定数プールでA$B$C
クラスの名前がABCDE
に変更され、class
ファイル内A$B$C
クラスのファイル名と名前が変更された場合は、Java仮想マシンが幸せに新たに実行されます
名前付き内部クラス。
これはどういう意味ですか?
クラス名にMyClass$1$1$1 ... $1
を使用する必要はありませんが、スイートに必要なものはすべてより短いファイル名に複数の組み合わせを含めることができます。
どのように誰かがこれを行うでしょうか?私は読者に運動として残しておきます。この記事では、新しいクラス名としてABCDE
の使用
上
注意、ネストされた内部クラスの名前、A$B$C
はで、同じクラス名の長さを保つためにABCDE
に変更されましたClassFormatError
がスローされないようにしてください。これは、定数プールのCONSTANT_Utf8_info
structureに文字列の長さを示すlength
というプロパティがあるためです。テキストエディタでclass
ファイルを編集していたため、長さを変更できませんでした。
定数プールの文字列を短くするには、文字列自体の長さを反映するようにlength
フィールドの値を変更する必要があると思います。
更新
はい、それは内部クラスの名前を短くするclass
ファイルの定数プールを編集することが可能です。
ABCDE
クラスをZ
クラスに変更できました。ここ
はA.class
の分解の一部です:
Compiled from "A.java"
class A extends java.lang.Object
SourceFile: "A.java"
InnerClass:
#10= #3 of #7; //B=class A$B of class A
#22= #2 of #3; //C=class Z of class A$B
// ... snip ...//
const #2 = class #21; // Z
// ... snip ...//
const #21 = Asciz Z;
// ... snip ...//
分かるように、内部クラスは現在なくA$B$C
より、Z
によって参照されます。
変更は、文字列の長さが今であることを示す、A.class
とA$B$C.class
ファイル内の文字列A$B$C
を探している、とZ
に置き換えること、および値0x05
0x01
への文字列の前の文字を変更して行われました5
ではなく1
です。
これらの変更を加えて、ファイル名をZ.class
に変更すると同時に、プログラムは何も起こらなかったかのように動作しました。
したがって、はい、それは可能です同様に内部クラスの名前を短縮します。
あなたは100レベル以上のネストされたクラスを持っていますか?うんざりする:) – Bombe