将字节码类型转换为java类型
我想使用api将字节码类型转换为java,而不是手动为其编码,是否有api?由于要求越来越高,我不得不继续手动添加转换类型,这有点繁琐将字节码类型转换为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; 以前,我手动使用
[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,它将是简单和安全的。