なぜオブジェクトがsoundlesslyのIntelliJ IDEAのデバッガによって変更されていますか?

しゃっくり:

私は、デバッグ(Shiftキー+ F9)メソッドだoffer(E e)JDK8 APIののjava.util.concurrent.ConcurrentLinkedQueue

私はのIntelliJ IDEAは、フィールドに変更します見つけhead、デバッグの過程でsoundlesslyこのキューのを、

しかし、実行スキーマ(Shiftキー+ F10は)なぜ、フィールドを変更しないのだろうか?

そして何のコードはこのフィールドを変更していないがありますoffer(E e)、それは私が混乱になり、。

その後、私は別のIDE(EclipseのMars.1リリース(4.5.1))、それはこのような問題を持っていないを試してみました。

私のテストのいくつかの結果があります。

  • 実行スキーマ(Shiftキー+ F10)
head: 1159190947 
head: 1159190947 
head: 1159190947 
head: 1159190947 
  • デバッグスキーマ(ステップオーバー:F8)
head: 1989972246 
head: 1791930789 
head: 1791930789 
head: 1791930789 
  • デバッグスキーマ(再開プログラム:F9)
head: 1989972246 
head: 1989972246 
head: 1791930789 
head: 1791930789 

バージョン情報:
のIntelliJ IDEA 2018.1(アルティメットエディション)
ビルド#IU-181.4203.550、2018年3月27日上に構築された
JRE:1.8.0_162-B12 AMD64
JVM:は、Java HotSpot(TM)64ビットサーバーVMのOracleによる社
のWindows 10 10.0

そして、のIntelliJ IDEA 2018年2月3日(コミュニティ版)のIntelliJ IDEA 2019.1(アルティメットエディション)は、同じ問題を抱えています。

import java.lang.reflect.Field;
import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueTest {

    public static void main(String[] args) {
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
        print(queue);
        queue.offer("aaa");
        print(queue);
        queue.offer("bbb");
        print(queue);
        queue.offer("ccc");
        print(queue);
    }

    /**
     * 打印并发队列head属性的identityHashCode
     * @param queue
     */
    private static void print(ConcurrentLinkedQueue queue) {
        Field field = null;
        boolean isAccessible = false;
        try {
            field = ConcurrentLinkedQueue.class.getDeclaredField("head");
            isAccessible = field.isAccessible();
            if (!isAccessible) {
                field.setAccessible(true);
            }
            System.out.println("head: " + System.identityHashCode(field.get(queue)));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            field.setAccessible(isAccessible);
        }
    }
}
Yole社:

デフォルトでは、IntelliJ IDEAが起動するtoString()腕時計ビューでのプレゼンテーションを得るために、オブジェクトのメソッドを。ConcurrentLinkedQueuetoString()更新することができますコレクションの方法を反復し、headViaフィールドのupdateHead()中の呼び出しfirst()方法(そしておそらく他の場所で、私は、全体の実装を検討していません。

あなたは環境設定に行けば| ビルド、実行、展開| デバッガ| データビュー| Javaとオフには「のtoString()オブジェクト・ビューを有効にする」、あなたはもう、この動作を観察するべきではありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=180160&siteId=1