Java中是否有一种模仿基本类型转换为Character的方法?

时间:2017-01-05 02:50:29

标签: java casting primitive-types

为了简化一些字节码分析,我想通过调用盒装类型的等效方法来替换Java程序中的原始类型的显式(向下)强制转换。在大多数情况下,这很简单:

double d = 42.0;
int i = (int)d;

可以变成

Double tmp = new Double(d);
int i = tmp.intValue();

这适用于所有签名类型。但是charCharacter没有这样的方法。也就是说,Integer,Float等具有方法intValuefloatValue等,但没有方法charValue。是否有从原始类型转到char / Character的jdk方法?

所以基本上,有这样的事情:

Integer num = new Integer(65);
char ch = num.charValue();

关键是不要使用(char)

2 个答案:

答案 0 :(得分:3)

如果您正在修改字节码,我认为您不需要转换为char。在字节码中,char类型是实际作为int处理的二等公民。来自JVMS §4.9.2

  

还允许对类型为int的值进行操作的指令对booleanbytecharshort类型的值进行操作。< / p>      

如§2.3.4和§2.11.1所述,Java虚拟机在内部将类型booleanbyteshortchar的值转换为输入int。)

因此,虽然您不能在没有显式强制转换的情况下将int分配给Java语言中的char,但您可以在字节码中执行此操作,因为它们具有相同的“{ {3}}“,即intchar的字节码表示只是一个int恰好其高两个字节为零。所以而不是:

char ch = num.charValue();

你可以逃脱(字节码):

int ch = num.intValue() & 0x0000FFFF;

然后假装chchar(例如,将其传递给期望char的方法或将其存储在char字段或数组中)。

但是,如果我理解正确,那就是verification type intchar强制转换指令已经执行的操作,所以用显式AND操作替换它不会更简单

  

如果将(签名)双精度转换为(无符号)字符,也很难找到实际发生的情况。

当您从floatdouble投射到byteshortchar时,它会首先投射到int,这会使其饱和范围超出Integer.MAX_VALUEInteger.MIN_VALUE的值,然后截断int的字节以适合最终类型。见i2c。截断步骤意味着将超出范围的浮点值转换为byteshortchar可能不会产生有用的结果。

答案 1 :(得分:1)

我不认为课程中有任何直接方法可以获得_GET_MERCHANT_LISTINGS_ALL_DATA_表示。但是,简单的解决方案是:

char

我确信你想到了这一点。但似乎并没有更好的方式。