Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字节码类型转换为java类型_Java_Bytecode - Fatal编程技术网

将字节码类型转换为java类型

将字节码类型转换为java类型,java,bytecode,Java,Bytecode,我想使用api将字节码类型转换为java,而不是手动为其编码,是否有api?由于要求越来越高,我不得不继续手动添加转换类型,这有点繁琐 [Ljava/lang/StackTraceElement; J[Ljava/lang/StackTraceElement; Ljava/util/Map; Ljava/util/LinkedList; Ljava/lang/String; Ljava/net/URL; Z Ljava/lang/String; [Ljava/net/URL; 以前,我手动使用

我想使用api将字节码类型转换为java,而不是手动为其编码,是否有api?由于要求越来越高,我不得不继续手动添加转换类型,这有点繁琐

[Ljava/lang/StackTraceElement;
J[Ljava/lang/StackTraceElement;
Ljava/util/Map;
Ljava/util/LinkedList;
Ljava/lang/String;
Ljava/net/URL;
Z
Ljava/lang/String;
[Ljava/net/URL;
以前,我手动使用代码,如下所示

 private static Type getType(final char[] buf, final int off) {
    int len;
    switch (buf[off]) {
    case 'V':
        return VOID_TYPE;
    case 'Z':
        return BOOLEAN_TYPE;
    case 'C':
        return CHAR_TYPE;
    case 'B':
        return BYTE_TYPE;
    case 'S':
        return SHORT_TYPE;
    case 'I':
        return INT_TYPE;
    case 'F':
        return FLOAT_TYPE;
    case 'J':
        return LONG_TYPE;
    case 'D':
        return DOUBLE_TYPE;
 }
}
当我使用asm库进行此操作时

Type.getArgumentTypes(desc);
它向我显示了一个错误,如下所示

线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:44 位于org.objectweb.asm.Type.getArgumentTypes(未知源)


我将添加一个getTypeLength方法:

private static int getTypeLength(final char[] buf, final int off) {
    switch (buf[off]) {
        case 'V':
        case 'Z':
        case 'C':
        case 'B':
        case 'S':
        case 'I':
        case 'F':
        case 'J':
        case 'D':
            return 1;
        case 'L':
        {
            int i = offs+1;
            while (buf[i] != ';') {
                ++i;
            }
            return i-offs+1;
        }
        case '[':
            return getTypeLength(buf, off+1)+1;
    }
}
然后:

private static Type getType(final char[] buf, final int off) {
    int len;
    switch (buf[off]) {
        case 'V':
            return VOID_TYPE;
        case 'Z':
            return BOOLEAN_TYPE;
        case 'C':
            return CHAR_TYPE;
        case 'B':
            return BYTE_TYPE;
        case 'S':
            return SHORT_TYPE;
        case 'I':
            return INT_TYPE;
        case 'F':
            return FLOAT_TYPE;
        case 'J':
            return LONG_TYPE;
        case 'D':
            return DOUBLE_TYPE;
        case 'L':
        {
            int len = getTypeLength(buf, offs);
            String name = new String(buf, offs+1, len-2).replace('/', '.');
            return Class.forName(name);
        }
        case '[':
            int len = getTypeLength(buf, offs);
            return Class.forName(new String(buf, offs, len));
    }
}

如果您使用的是asm,则会是这样

Type.getType(desc).getClassName();

asm库中的Type类及其接受字符串的静态方法getType将字节码类型转换为java类型

我认为你不会找到一个只有这个特性的API。如果你只需要这个类型,你的就可以了。你可以学习一些反编译器代码,就像我在使用asm一样,它为这些代码提供了一些功能集,但找不到方法。谢谢你,但我的要求是我不想手动执行,因为我无法添加所有类型,也无法跟踪可能出错的地方。因此,如果我可以使用api,它将是简单和安全的。