この質問は現在ほぼ3年前のものですが、質問の一部がまだ回答されていないことがわかりました。
そして:それは、クラスBが実行時にプライベートではなくなったことを意味しますか?
skaffmansの回答が示唆するCarlosHeubergersのコメントによると、クラスB
はまだprivate
パッケージ内の他のクラス用です。
彼はおそらくJavaプログラミング言語に適しています。つまりB
、他のクラスからクラスを参照することはできません。少なくともリフレクションを使用せずに(プライベートクラスのメンバーにも外部からアクセスできる)、これは別の問題です。
しかし、JVMには(skaffmanが述べているように)内部クラスの概念がないため、バイトコードレベルで「1つのクラスだけがアクセスできる」可視性がどのように実現されるかを自問しました。答え:それはまったく実現されていません。JVMの場合、内部クラスは通常のパッケージのプライベートクラスのように見えます。つまり、自分でバイトコードを作成する(またはコンパイラによって生成されたバイトコードを変更する)と、B
問題なくクラスにアクセスできます。
同じパッケージ内のすべてのクラスからすべての合成アクセサーメソッドにアクセスすることもできます。A
したがって、クラスのメソッドでクラスのプライベートフィールドに値を割り当てるB
と、デフォルト(つまりパッケージプライベート)の可視性を持つ合成アクセサメソッドがクラスA
(のような名前access$000
)で生成され、値が設定されます。このメソッドはクラスからのみ呼び出されることになっていますB
(実際、Java言語を使用してそこからのみ呼び出すことができます)。ただし、JVMの観点からは、これは他のメソッドと同様に単なるメソッドであり、任意のクラスから呼び出すことができます。
だから、質問に答えるために:
- Java言語の観点からは、クラス
B
はプライベートであり、プライベートのままです。
- JVMの観点からは、クラス
B
(またはそれ以上:class A$B
)はプライベートではありません。