1

これらのハッシュテーブルを宣言して初期化しました。

Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
   ht.put("due", 2);
   ht.put("tre", 3);
   ht.put("uno", 1);

 Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
   ht.put("dodici", 12);
   ht.put("tredici",13);
   ht.put("nove", 9);
   ht.put("dieci", 10);

要素のペアを比較するために JDI を使用してハッシュテーブルから値を抽出したいのですが、パラメーターとして ArrayReference s0、s1 ArrayReference、パラメーター parameter1、パラメーター 2 パラメーターを持つメソッドがあります。

    if(parameter1.getType().name().equals("java.util.Hashtable")){
    System.out.println(" - Hashtable/HashMap - ");

     ObjectReference o = (ObjectReference) parameter1.getValue();
     ObjectReference o2 = (ObjectReference) parameter2.getValue();

        ClassType ct = (ClassType) o.type();

        System.out.println("ct "+ ct.allFields());
            Value x=o.getValue(ct.fieldByName("table") ); // hashtable.Entry
            Value y=o2.getValue(ct.fieldByName("table"));


            System.out.println(y.toString());

            System.out.println(o.getValue(ct.fieldByName("table")));
            Parameter p1 =new Parameter(ct.fieldByName("table").name(),x.type(),x);
            Parameter p2 =new Parameter(ct.fieldByName("table").name(),y.type(),y);
                if(p1 != null && p2!=null)

                    distObject = getDistanceCollections(p1,p2);

    }
        ...

        else if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){

                ObjectReference ox = (ObjectReference) s0.getValue(i-1);
                ObjectReference oy = (ObjectReference) s1.getValue(j-1);

                ClassType ct = (ClassType) ox.type();
                ClassType ct2 = (ClassType) oy.type();
        System.out.println("ct field Entry: "+ct + ct.allFields());

        Value keyx= ox.getValue(ct.fieldByName("key"));
        Value valuex= ox.getValue(ct.fieldByName("value"));

        Value keyy= oy.getValue(ct2.fieldByName("key"));
        Value valuey= oy.getValue(ct2.fieldByName("value"));

        if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){
            Parameter p1 =new Parameter(ct.fieldByName("value").name(),valuex.type(),valuex); 
                Parameter p2 =new Parameter(ct2.fieldByName("value").name(),valuey.type(),valuey);
                    if(p1 != null && p2!=null)
                        match = getDistanceCollections(p1,p2);
                }
...

for (int j = 1; j < len1; j++) {        
        System.out.println( s1.getValue(j-1));
    }

    for (int i = 1; i < len0; i++)        
        System.out.println( s0.getValue(i-1));

    ...

    else if(typeName.equals("java.lang.Integer")
            ||typeName.equals("java.lang.Boolean")
            ||typeName.equals("java.lang.Double")
            ||typeName.equals("java.lang.Float")
            ||typeName.equals("java.lang.Byte")
            ||typeName.equals("java.lang.Long")
            ||typeName.equals("java.lang.Short")
            ||typeName.equals("java.lang.Character")){


                Value x=o.getValue(ct.fieldByName("value")); //Integer.value
                Value y=o2.getValue(ct2.fieldByName("value"));

            System.out.println("Valori: x = "+x+" y ="+y);

            distObject = (double) getDistancePrimitive(x.type(), x,y.type(),y);

            double matchInternal= distObject;

        ...

問題は、値の抽出中に要素が失われることです。この要素はメモリ内にありません。Java バージョン: 1.8.0_40

出力: http://i.imgur.com/BrqctVj.gif

誰も修正方法を知っていますか?

4

1 に答える 1

0

Hashtable オブジェクトは、キーのハッシュ値に基づいてキーと値のペアをテーブルに格納します。2 つの異なるキーが同じハッシュ値を持つ場合、2 番目の値がそのハッシュ値の次の値として格納されます。

ここでグラフィカルな例を見ることができます: hashTable

JDIを使用し、例のように「java.util.Hashtable」がある場合は、フィールドテーブルを抽出する必要があり(方法)、「java.util.Hashtable$Entry」クラスタイプを取得します。

このタイプには 4 つのフィールドjava.util.Hashtable$Entry.hash、java.util.Hashtable$Entry.key、java.util.Hashtable$Entry.value、java.util.Hashtable$Entry.nextがあり、現在は次のフィールドを考慮しないため、キーと値が失われます。

于 2015-06-06T22:36:39.247 に答える