为了简化一些字节码分析,我想通过调用盒装类型的等效方法来替换Java程序中的原始类型的显式(向下)强制转换。在大多数情况下,这很简单:
double d = 42.0;
int i = (int)d;
可以变成
Double tmp = new Double(d);
int i = tmp.intValue();
这适用于所有签名类型。但是char
和Character
没有这样的方法。也就是说,Integer,Float等具有方法intValue
,floatValue
等,但没有方法charValue
。是否有从原始类型转到char / Character的jdk方法?
所以基本上,有这样的事情:
Integer num = new Integer(65);
char ch = num.charValue();
关键是不要使用(char)
。
答案 0 :(得分:3)
如果您正在修改字节码,我认为您不需要转换为char
。在字节码中,char
类型是实际作为int
处理的二等公民。来自JVMS §4.9.2:
还允许对类型为
int
的值进行操作的指令对boolean
,byte
,char
和short
类型的值进行操作。< / p>如§2.3.4和§2.11.1所述,Java虚拟机在内部将类型
boolean
,byte
,short
和char
的值转换为输入int
。)
因此,虽然您不能在没有显式强制转换的情况下将int
分配给Java语言中的char
,但您可以在字节码中执行此操作,因为它们具有相同的“{ {3}}“,即int
。 char
的字节码表示只是一个int
恰好其高两个字节为零。所以而不是:
char ch = num.charValue();
你可以逃脱(字节码):
int ch = num.intValue() & 0x0000FFFF;
然后假装ch
是char
(例如,将其传递给期望char
的方法或将其存储在char
字段或数组中)。
但是,如果我理解正确,那就是verification type int
到char
强制转换指令已经执行的操作,所以用显式AND操作替换它不会更简单
如果将(签名)双精度转换为(无符号)字符,也很难找到实际发生的情况。
当您从float
或double
投射到byte
,short
或char
时,它会首先投射到int
,这会使其饱和范围超出Integer.MAX_VALUE
或Integer.MIN_VALUE
的值,然后截断int
的字节以适合最终类型。见i2c
。截断步骤意味着将超出范围的浮点值转换为byte
,short
或char
可能不会产生有用的结果。
答案 1 :(得分:1)
我不认为课程中有任何直接方法可以获得_GET_MERCHANT_LISTINGS_ALL_DATA_
表示。但是,简单的解决方案是:
char
我确信你想到了这一点。但似乎并没有更好的方式。