問題タブ [inner-classes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java の内部クラスはセキュリティ上のリスクをもたらしますか?
最近、私のプロジェクトのセキュリティ チームが、コード レビューの一部として使用するように設計された安全なコード ガイドライン ドキュメントをリリースしました。最初に印象に残ったのは、「内部クラスを使用しないでください」という項目でした。これは非常に手荒で抜本的な声明のように思えました。内部クラスは正しく使用すれば良いのですが、少しグーグルで調べたところ、便宜上ここに引用されているthisを見つけました。
ルール 5: 内部クラスを使用しない
一部の Java 言語の本では、内部クラスには、それを囲んでいる外部クラスからのみアクセスできると書かれています。本当じゃない。Java バイト コードには内部クラスの概念がないため、内部クラスはコンパイラによって通常のクラスに変換され、同じパッケージ内の任意のコードにたまたまアクセスできます。また、ルール 4 は、保護のためにパッケージのスコープに依存しないことを示しています。
しかし、待ってください、それは悪化します。内部クラスは、それらのフィールドが非公開と宣言されていても、囲んでいる外部クラスのフィールドにアクセスできます。そして、内部クラスは別のクラスに変換されます。この個別のクラスが外部クラスのフィールドにアクセスできるようにするために、コンパイラはこれらのフィールドをプライベートからパッケージ スコープに暗黙のうちに変更します。内部クラスが公開されるだけでも十分ではありませんが、一部のフィールドを非公開にするという決定をコンパイラが黙って却下するのはさらに悪いことです。できる限り内部クラスを使用しないでください。(皮肉なことに、新しい Java 2 doPrivileged() API の使用ガイドラインでは、内部クラスを使用して特権コードを記述することを提案しています。これが、doPrivileged() API が気に入らない理由の 1 つです。)
私の質問は
- この動作は Java 5/6 でもまだ存在しますか?
- 外部クラスと内部クラス以外の、外部クラスのプライベート メンバーにアクセスしようとしたクラスがコンパイルされないことを考えると、これは実際にセキュリティ リスクになるのでしょうか?
- 「ガイドライン」「内部クラスを使用しない」を保証するのに十分なセキュリティリスクをもたらしますか?
java - Javaが内部クラスの静的フィールドを禁止するのはなぜですか?
で静的フィールドにアクセスすることはできませんがOuterClass.InnerClass.i
、作成された InnerClass オブジェクトの数など、静的であるべきものを記録したい場合は、そのフィールドを静的にすると便利です。では、なぜJavaは内部クラスの静的フィールド/メソッドを禁止するのでしょうか?
編集:静的ネストされたクラス(または静的内部クラス)でコンパイラを満足させる方法を知っていますが、知りたいのは、Javaが内部クラス(または通常の内部クラス)内の静的フィールド/メソッドを言語設計と誰かがそれについてもっと知っているなら、実装の側面。
java - JYAML: ネストされた/内部クラスをシリアライズ/デシリアライズする
まずは皆様、メリークリスマス!
Outer
ここで私の質問に:内部クラス Innerを持つクラスがあるとしましょう。のフィールドとしてOuter
、List<Inner>
YAML ファイルにダンプしたい があります。私はこれを次のようにします:
これは私に例外を与えます:Exception in thread "main" org.ho.yaml.exception.ObjectCreationException: Error near line 0: Can't create object of type class game.Outer$Inner using default constructor.
カスタムコンストラクターを提供し、アクセスレベルをパブリックに変更しようとしましたが、役に立ちませんでした。何か案は?
java - 内部クラスでパラメーター化されたジェネリック型を使用するにはどうすればよいですか?
ジェネリック パラメーター化された型を持つ内部クラスを実装しようとしています。
ここに私のコードの短いバージョンがあります:
それは動作しません。T
Eclipse/Javaから、内部クラスの型パラメーターがスーパー クラスのパラメーターを「隠している」という警告が表示されます。これを修正する方法について何か考えはありますか?
編集:問題がある他の内部クラスを追加しました: TreePreOrderIterator
. 、、およびのジェネリック型T
は同じになります。内部クラスは、AVLTree のフィールドにアクセスする必要があります。AVLTree
BinaryNode
TreePreOrderIterator
EDIT2: また、 は競合Iterator
する a にアクセスします。BinaryNode<T>
(注: これは私がクラスで行っているより大きなプロジェクトの一部です。他の情報が必要な場合は、お問い合わせください。)
java - 春で内部クラスを作成する
Springで非静的内部クラスを作成するための最良のアプローチは何ですか?
これはうまくいくようですが、コンストラクター引数の必要性を避けたいです:
python - 内部クラスから外部クラスにアクセスするには?
みたいな状況になってしまって…
Outer
クラスからクラスのメソッドにアクセスするにはどうすればよいInner
ですか?
java - 匿名の内部クラス インスタンスが他の場所で参照されている間に、クラスのガベージ コレクションを許可しますか?
私はクラスAを持っています:
インスタンスb
には、その外部クラスのインスタンスの暗黙的な参照があります (これは によって参照できますthis
)。これで、別のオブジェクトがb
getter メソッドを介してこれへの参照を取得します。これb
は参照のためガベージ コレクションできません。
A
おそらく匿名の内部クラスで明示的な参照をリセットすることにより、囲んでいるインスタンスのガベージコレクションを許可する可能性を得る方法はありますか?
java - Java Reflection を使用して内部クラスのインスタンスを作成することは可能ですか?
コードのサンプル:
名前を付けてクラス Bar の新しいインスタンスを作成することは可能ですか? 私は使用しようとしました:
クラスが見つかりますが、c.newInstance() を使用すると InstantiationException がスローされます。
.net - プロパティとしてのビジュアルC ++内部クラスは可能ですか?
C++ プログラマーとして、最近ビジュアル C++ を使い始めました。私はプロパティに行き詰まっています。
アイデアは、2 つのメソッドと get/set 関数のようなプロパティを持つ内部クラスを作成することです。ビジュアルC++でも可能ですか(私はそう思います)。
使用法は次のようになります。
演算子のオーバーロードを使用してこれを実行しようとしましたが、「通常の」c++ よりもビジュアル c++ の方がはるかに複雑なようです。
MJ
scala - Scala で内部クラスの型を参照する
次のコードは、DSL のポリモーフィック埋め込みを模倣しようとしてInner
いますuseInner
。enclosing
ユーザーがインスタンスへの参照を保持するだけでよいように、メソッドを追加しましたInner
が、常にそれを囲むインスタンスを取得できます。これによりInner
、特定のインスタンスのすべてのインスタンスOuter
が 1 つの動作のみにバインドされます (ただし、ここでは必要です)。
それはコンパイルされず、scala 2.8 は次のように文句を言います:
Programming Scala: Nested classesとA Tour of Scala: Inner Classesから、問題は特定useInner
のインスタンスからのインスタンスを引数として期待することだと私には思えます。Inner
Outer
この問題の本当の説明と解決方法は何ですか?