問題タブ [static-initializer]
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 - エマに干渉する静的イニシャライザ
JUnit/emma (かなり基本的なクラス) ですべての行をカバーするクラスを作成しました。
Emma の eclipse 出力では、すべての行が緑色 (覆われている) で表示されます。しかし、エマのレポート (HTML) は、私が 1 つの命令を見逃していることを示しています。クラスが黄色で強調表示されます (パブリック クラス X)。
欠落した命令は、「静的初期化子」に関連しているようです。私はそれらに精通していますが、この特定のクラスにはありません
その中にブロックします。静的メソッドはまったくありません。4 つの public static final int があります。また、列挙型も含まれています。
HTML 出力は次のことを示します。
カバーされていない命令 (およびメソッド) として。
この謎の指示はどこから来るのですか?どうすればテストできますか?
このファイルには内部クラスはありません。$1 がどこから来ているのかさえ説明できません。
java - 宣言の前に置かれた場合の静的初期化子エラー
静的初期化子に、javac のバグである可能性があるものがあることに気付きました。変数に値を割り当てることはできるが、その値を読み取ることはできないというシナリオを作成しました。
以下に 2 つの例を示します。1 つ目は正常にコンパイルされ、2 つ目は tmp から値を読み取ろうとするとエラーが発生しますが、何らかの理由で tmp に値を代入することが許可されています。静的初期化子の後に tmp が宣言されているため、変数の読み取りも書き込みもできないかどうかは理解できましたが、そのうちの 1 つだけのエラーは意味がありません。
この点をさらに強調すると、これは正常にコンパイルされます。
java - Java の静的初期化子と最終定数
Java で次の単純なコードが与えられます。
この最も単純な Java コードでは、メソッドを通じてクラスが初期化static
されたときにコンストラクターが呼び出されることが期待されていますが、そうではありません。Demo
main()
Demo.serialVersionUID
このプログラムを変更せずに実行した場合、出力は1
(メッセージ -静的コンストラクターが呼び出されました。ブロックで指定されたstatic
とおりに表示されません) のみになります。
メッセージをイニシャライザで指定したとおりに出力したい場合は、クラスstatic
の宣言ステートメントを変更する必要があります。Demo
どちらかに、
final
修飾子を削除するか、
プリミティブ型long
を対応するラッパー型に変更しますLong
。
では、なぜこのように振る舞うのでしょうか。static
プログラムに指定された変更を加えないと、コンストラクターにメッセージが表示されないのはなぜですか?
java - 静的初期化子からの静的最終フィールドの初期化
宣言クラスを修飾子として (静的な方法で) 使用して、対応する静的初期化子から static final フィールドにアクセスできないのはなぜですか?
最初は、これは Eclipse のバグだと思いました。
また、静的初期化子は私の日常業務ではないため、知識が不足していました。しかし、見よ、これはクラス修飾子なしで期待どおりに機能します。
テスト シリーズを完了するために、bash で試してみました。
同じ結果を引き起こします。
これは私を最後の質問に導きます:
静的初期化ブロックから静的最終フィールドにアクセスするときにクラス修飾子を禁止する理由はありますか? 宣言クラスが以前に初期化されていなかったためですか?
java - 内部クラスが静的初期化子を使用できないのはなぜですか?
引用JLS #8.1.3 :
内部クラスは静的初期化子を宣言しない場合があります( §8.7 )......
これは次のように示されます。
Java の内部 (非静的) クラスは、他のすべてのクラスと同じようにクラス ローダーによってロードされるため、静的初期化子を使用できないのはなぜでしょうか?
この制限の背後にある理由は何ですか?
java - クラスの静的初期化子をテストする最良の方法は何ですか?
かなり複雑な静的初期化を持つクラスがあります。ディレクトリからファイルを読み取り、それらの json ファイルを解析し、オブジェクトにマッピングし、リストを埋めています。ご想像のとおり、いくつかの例外が発生する可能性があり、それらのコードブランチをカバーしてテストする必要があります。問題は、この静的初期化がテストケース ファイルで 1 回だけ実行されることです。私が遭遇するソリューション:
- 各動作の新しいテストケース ファイル
- 静的クラスをアンロードする
- 新しい JVM
私はこれらのオプションに魅力を感じていません。もっと良いものはありませんか?
java - Java ClassLoader の問題または同時実行エラー?
WebLogic アプリケーションが数週間正常に動作していた後、突然例外が発生しました。
NoClassDefFoundError
その後、アプリサーバーが再起動されるまで、アプリケーションは完全に無効になります。
完全なスタック トレースは、問題の原因がConcurrentModificationException
静的初期化子にあることを示しています。
具体的には、同等/最小化されたコードは次のとおりです。
これは例外の起源です:
したがって、アプリケーションの実行中のある時点で、WebLogic はクラスをリロードすることを決定したようですが、静的ブロックが実行されると、オブジェクトが変更されているpackage b
ことがわかります。Properties
同時に呼び出されているのか、複数回呼び出されているのかわかりません。Properties
オブジェクトは、アプリが初めて新しく読み込まれたときに作成された元のインスタンスであり、CommonStuff
クラスのリロードが再度呼び出されようとしている可能性がありますputAll()
。
私がそうすれば助けになりますか:
大企業の本番アプリなので、やみくもにやってみることはできません。そのため、どこが間違っているのか、真夜中にクラスがリロードされている間にこれらの変数をプロパティ初期化する方法を理解しようとしています。
何か案は?
これは WebLogic ClassLoader の問題でしょうか?