使用JDI

时间:2015-06-05 08:43:17

标签: java hashtable jdi

我已经声明并初始化了这些哈希表:

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,parameter2参数:

    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

有谁知道如何解决?

1 个答案:

答案 0 :(得分:0)

Hashtable对象根据键的哈希值将对键值存储在表中。如果两个不同的键具有相同的哈希值,则第二个值将存储为该哈希值的下一个值。

您可以在此处查看图形示例:hashTable

当你使用JDI时,如你的例子中你有“java.util.Hashtable”,你必须提取字段表(你是怎么做的),然后你将获得一个“java.util.Hashtable $ Entry”classType。

此类型有4个字段 java.util.Hashtable $ Entry.hash,java.util.Hashtable $ Entry.key,java.util.Hashtable $ Entry.value,java.util.Hashtable $ Entry.next , 现在你只处理键和值,并且因为你不考虑 next 字段而丢失了一个值。