古いJavaプロジェクトをバグ修正する必要があります。これはJava 5に固執しています。これはJava 8でコンパイルできますが、いくつかのGUIコンポーネントは正しく動作しなくなります。私が最初に見たことは本当に私に衝撃を与えました:この[censored]オリジナルの開発者は、多くの新しいクラスを持つjavax.swingパッケージを構築しました。だから私がやった最初のことは、全部の名前を別の名前空間に移動させることでした。 Eclipseのリファクタリング機能を使用して、javax.swing全体とそのすべてのサブパッケージの名前をsomethingelse.swingに変更しました。今はもうコンパイルされません。うまくいけば、私はバグを見つける機会があります。Javaスイングコンポーネントのシリアル化
私はこだわっている現在のバグは、この方法である:
private void writeObject(ObjectOutputStream s) throws IOException {
s.defaultWriteObject();
if (getUIClassID().equals(uiClassID)) {
byte count = JComponent.getWriteObjCounter(this);
JComponent.setWriteObjCounter(this, --count);
if (count == 0 && ui != null) {
ui.installUI(this);
}
}
}
クラスこれは、いくつかのエキストラとのJComboBoxの一種であるの一部です。私は本当にエキストラは分かりません。大事なことじゃない。ここでの問題は次のとおりです。メソッドJComponent.getWriteObjCounter()およびsetWriteObjCounter()はpackage-privateです。元のコードはこれらのメソッドにアクセスできました。移動したコードにはこれがありません。これらはパッケージプライベートなので、私はそのドキュメントを見つけることはできませんでした。だから私は、Javaシリアライゼーション機能用のカスタム・シリアライザであるという事実の他に、これが何であるかの考えを持っていません。
私は最初の行を理解しています。これが標準です。興味深いことに、それはデフォルトを書き込むだけで、それ以外は何も書きません。だから私は強く疑問に思う方法全体が必要かどうか全く。しかし、方法の残りの部分は、それが何をすべきか分かりません。カウンタが0にカウントされると、UIデリゲートがインストールされているようですなぜ読んでいないのですか?そして、このカウンターは何ですか?どのように処理されますか?それはどんな目的のためですか?
ここでのJComponentクラスの元のJavaコードは次のとおりです。
static byte getWriteObjCounter(JComponent comp) {
return (byte)((comp.flags >> WRITE_OBJ_COUNTER_FIRST) & 0xFF);
}
しかし、それはどちらかそれに多くの光を当てるしません。属性JComponent.flagsにはアクセスできません。 javax.swingパッケージの外部からではありません。だから私はこれが何であるか分かりません。
既に述べたように、私はこの方法が全く意味をなさないことを強く疑う。誰もが私に言うことができる場合でも、どのような目的のために、このwriteObjCounterは私がソースの
ルック:-(メンテナンス地獄に良く推測:)
感謝 ジークフリートGipp
'JComponent'ソースを' private static final int WRITE_OBJ_COUNTER_FIRST'で見てください。そこにあるコメントは、ネストされたwriteObject呼び出し*を処理するために使用されているとのコメントです。 –