4

OSGiバンドルb1でクラスをエクスポートしています

public static final String MYVAL = "a"; //version 1

2番目のバンドルb2は、バージョン1のb1を使用してコンパイルおよびデプロイされます。

後でb1の値をに変更します

public static final String MYVAL = "b"; //version 2

しかし、私はb1を再コンパイルしてデプロイするだけで、b2は変更されず、再コンパイルされません。

b2がa実行時にまだ値を認識している可能性はありますか?

4

1 に答える 1

8

参照される静的最終プリミティブまたは文字列の値は、usingクラスに直接インライン化されます。したがって、OSGIや可視性ルールとは関係なく、「a」の値がb2埋め込まれます。MYVAL

これは、 Java言語仕様のセクション13.4に文書化されていると思います。

フィールドが定数変数(§4.12.4)の場合、キーワードfinalを削除したり、その値を変更したりしても、既存のバイナリを実行しないようにして互換性を損なうことはありませんが、使用法の新しい値は表示されません。それらが再コンパイルされない限り、フィールドの。これは、使用法自体がコンパイル時定数式(§15.28)でない場合でも当てはまります。

同様の質問に対するこの回答は、回避策を示しています。宣言を変更して定数式ではなくなると、このインライン化動作が無効になります。

public static final String MYVAL = String.valueOf("a");
于 2012-05-10T08:00:38.807 に答える