0

バイトコードを使用してJavaでクラスを動的に生成し、クラスをロードする作業を行っています。このコードは、チュートリアルでその方法を見つけました。

  private int stringConstant(String s) {
        return constant(CONSTANT_Utf8, s);
    }

    private int classConstant(String s) {
        int classNameIndex = stringConstant(s.replace('.', '/'));
        return constant(CONSTANT_Class, classNameIndex);
    }

    private int constant(Object... data) {
        List<?> dataList = Arrays.asList(data);
        if (poolMap.containsKey(dataList))
            return poolMap.get(dataList);
        poolMap.put(dataList, poolIndex);
        return poolIndex++;
    }

    private void writeConstantPool(DataOutputStream dout) throws IOException {
        dout.writeShort(poolIndex);
        int i = 1;
        for (List<?> data : poolMap.keySet()) {
            assert(poolMap.get(data).equals(i++));
            int tag = (Integer) data.get(0);
            dout.writeByte(tag);          // u1 tag
            switch (tag) {
                case CONSTANT_Utf8:
                    dout.writeUTF((String) data.get(1));
                    break;                // u2 length + u1 bytes[length]
                case CONSTANT_Class:
                    dout.writeShort((Integer) data.get(1));
                    break;                // u2 name_index
                default:
                    throw new AssertionError();
            }
        }
    }

    private final Map<List<?>, Integer> poolMap =
            new LinkedHashMap<List<?>, Integer>();
    private int poolIndex = 1;

リストを含むマップがどのように使用されているのか理解できません。この種のことを行う従来の oop の方法とは思えません。

4

1 に答える 1

0

あなたが私たちに与えたフラグメントでは、マップは、あなたが入れたすべてのリストに一意のインデックス (1 から増加) を割り当てる手段です。このインデックスは明らかに、キーが挿入された順序で取得されることを確認するためにのみ使用されます。これは、マップが.assertLinkedHashMap

与えられたコードに関する限り、 aLinkedHashSetも同様に実行されます。もちろん、constantetc. がどこで呼び出されるかはわかりません。おそらく、インデックスは呼び出し元によって使用されます。

OO の観点から異議はありません。そもそも、このコード フラグメントにはほとんど OO がありません。

于 2013-05-29T05:42:20.307 に答える