2017-04-11 9 views
0

古い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

+0

'JComponent'ソースを' private static final int WRITE_OBJ_COUNTER_FIRST'で見てください。そこにあるコメントは、ネストされたwriteObject呼び出し*を処理するために使用されているとのコメントです。 –

答えて

0

ようこそためのチャンスがあるでしょうですJComponent at constant WRITE_OBJ_COUNTER_FIRSTの:

/**ビット14-21は、ネストされたのwriteObject呼び出しを処理するために使用されている**/
プライベート静的最終int型WRITE_OBJ_COUNTER_FIRST = 14;

0。ネストされた JComponentオブジェクトをシリアル化するとき

したがって、getWriteObjCounter(JComponent)setWriteObjCounter(JComponent, byte)方法は何とかネストの深さを扱います。彼らはパッケージ内
//サブクラスから呼び出すことができるように、これらの関数は静的でなければなりません

//が、その継承hierarhcy外
//クラスが含まれています

またcomment in front of these 2 methodsを見てJComponentの下のパッケージ(JTextAreaなど)

したがって、これらのメソッドにはデフォルトのパッケージアクセスがあり、そうでなければJComponentのサブクラスのSwingシリアル化はもはやコンパイルできません。

+0

ああ、それは妥当だと思う。ネストされたwriteObject呼び出し。それについて考えなかった。しかし、これは私に2つのオプションを与えます:1.すべてのものをjavax.swing名前空間に戻します。これは極端に悪いオプションとみなされます。単にそのメソッドを削除するだけです。デフォルトのものを書き込むだけなので、組み込みのwriteObject()メソッドはそのカウンタだけでなく、一部のUIデリゲートも処理する必要があります。ちょうどここにちょうど私は本当に何が必要なのか分からない。 – Siegfried

+0

@Siegfriedのでオプション1は悪く、オプション2はネストしたオブジェクトを適切にシリアル化しないでしょうか? –

+0

それは私が恐れるものです:)我々は見るでしょう。私がそれをテストする前に、何とか修正しなければならない約20以上の危険があります。これには多くの時間がかかります。私が終わったら、ここに結果を掲載します。 – Siegfried

関連する問題