Javaクラスの定数は、静的定数の値を変更した後、有効になりません。

一定のクラスの変更静的定数値をし、サーバーへの定数クラスのクラスファイルをアップロード有効になりません、サービスを何度か再起動し、最後のクエリの関連情報、GUIツールのデコンパイラを使用して逆コンパイルをついに見つけ、コンパイルされたソースコードを表示問題:

単に静的定数は無用で変更するだけでなく、クラスの静的変数への参照をすべて再コンパイルする(またはこれらのカテゴリのサーバーを再アップロード)、または有効になりません。

ここに含まれるJava仮想マシンのコンパイラのメカニズムを:Javaファイル、ポイントが最終的な静的静的コンパイル時定数に、コンパイル後の静的定数である(実行時に部分的に一定値として解析され、一定になりました、代わりに、元のコードの)。この(例えば、整数、浮動小数点数、等)および全ての基本データ・タイプに適用java.lang.Stringで。

次の例を考えてみましょう。

クラスに、プログラムで使用される各種定数Contants.java一元管理します。

public class Contants{
    public static final String STR = "csyor.com";
    //......
}

特定の論理にコードセグメントは、次に、これらの定数に使用されます。これは、あなたがライン上に一定の内容を変更するときだけそれにクラスを変更、マジックナンバー/テキストの多くを回避し、経営定数を容易にするであろう。

import Contant;
public class SomeService {
    public void doSome() {
        // 这里应用了上一个类的静态常量Contants.STR
        System.out.println(Contants.STR);
    }
}

上記のコードでは、SomeService Contants.STRクラスは表面の値は、あらわす定数クラスによって達成され、この定数を使用するなど、以下、実際SomeServiceコンパイルされた後に、コードが変更されています。

import Contant;
public class SomeService {
    public void doSome() {
        // 这里把静态常量Contant.STR直接编译成为了一个常量"csyor.com"
        System.out.println("csyor.com");
    }
}

私たちは、SomeServiceがあるためSomeServiceの、「csyor.com」印刷にはまだ、我々は一定のあらわす定数クラスを変更するそうしても、何もあらわす定数クラスは、単にそこにあることを発見しましょうSTR =「www.csyor.com」が、そのままのコードでは、インクリメンタル・コンパイルの場合には、そのクラスファイルを再コンパイルされていません。

ここでは、求められることがあります:なぜあなたはローカルで使用するように簡単にそれをデバッグするのですか?

地元の一般的な使用のIDE(統合開発環境)が自動的にコンパイルされているため、一般的にのみ(つまり、クラスの静的定数が含まれている)あなたが変更したJavaコンパイラのファイルの後にクラスファイルをアップロードする際に主に、私たちは、サーバーにアップロードし、それはアップロードされませんので、何が変更されているので、他のクラス参照この静的定数に関しては、ローカルデバッグのために何も問題がなかったが、サーバー上の状況の影響はありません。

その後、我々はミドルウェアコンテナを再起動する必要があり、クラスはファイルを置き換えるために何であるかに関係なく:これらの上を参照してください、問題は、注意が解決されました。

解決策1:単に静的変数STRは無用で変更するだけでなく、ために、すべての引用された静的変数STR再コンパイル(サーバーに、その後、再アップロード)のクラスを、または有効になりません定数クラスを使用することです、再コンパイルします。

対処方法2:最後の削除

静的定数を使用する場合は、一度それを修正するので、注意する必要があり、あなたは置き換えを再コンパイルするためのプロジェクトを通じて引用された静的定数を配置する必要があります。

公開された23元の記事 ウォンの賞賛6 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_42046751/article/details/98188355