2017-01-05 3 views
4

バイトコード解析を単純化するために、Javaプログラムのプリミティブ型の明示的(下向き)キャストを、ボックス型の同等のメソッドを呼び出すことで置き換えたいと考えています。ほとんどの場合、それは簡単です:Javaにプリミティブ型のキャストを模倣するメソッドがありますか?

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

これは、すべての署名のタイプのために働く

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

に変換することができます。しかし、charCharacterの方法はありません。つまり、Integer、FloatなどのメソッドはintValue,floatValueなどですが、いずれもメソッドcharValueはありません。プリミティブ型からchar/Characterへのjdkメソッドはありますか?

だから基本的には、このようなものがあります:

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

とキーは(char)を使用しないことです。

+0

http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#charValue()? –

+0

@ScaryWombat私はOPが 'java.lang.Integer'などでそれを望んでいると思います。 – dasblinkenlight

+1

あなたの質問が理解できない限り、 –

答えて

3

バイトコードを変更する場合は、charにキャストする必要はありません。バイトコードでは、charタイプは、実際にはintとして処理される第2級市民です。 JVMS §4.9.2から:

タイプintの値で動作する命令はまたchar、タイプbooleanbyteの値を操作することを許可し、shortれます。

§2.3.4と§2.11.1で述べたように、Java仮想マシンが内部intを入力するタイプbooleanbyteshortの値を変換し、char。)

だから、あなたはできますが」明示的なキャストなしにintをJava言語のcharに割り当てると、同じ「verification type」(int)を持つため、バイトコードでこれを行うことができます。 charのバイトコード表現はちょうどintで、その上位2バイトがゼロになります。だから、代わりに:

char ch = num.charValue(); 

あなたが(バイトコード内)で逃げることができるようになります。

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

そしてちょうど期待するメソッドに渡し、chchar(例えばあることをふりchar)、フィールドまたは配列charに格納してください。

私はそれを正しく理解している場合しかし、それはi2cintcharへのキャストの命令はすでに何をするかですので、明示的なAND演算によって、それを交換しても、単純であることを行っていません。

それは(符号なし)文字に倍増(署名)を使用すると、キャスト場合、実際に何が起こるかを見つけるのも意外に難しいです。

Integer.MAX_VALUEまたは Integer.MIN_VALUEに範囲外の値に飽和あなたは floatまたは byteから doubleshort、または charから唱えたとき、それは最初 intにキャスト

、その後、合わせてintのバイトを切り捨て最終的なタイプ。 JLS §5.1.3 – Narrowing Primitive Conversionを参照してください。切り捨てのステップは、範囲外の浮動小数点値をbyte,short、またはcharに変換すると、おそらく有用な結果が得られないことを意味します。

+0

うわー!これはStackOverflowのためのものです!素晴らしい答えと非常にありがとう。 –

+0

fwiw、私はi2cを使わなかった理由を説明するだけです:私の分析は実際にはバイトコードのこの中間的な表現です(https://sable.github.io/soot/を参照)。あなたが処理しなければならない命令の総数を減らしてください。 –

1

charの表現を得るためのクラスに直接的なメソッドがあるとは思わない。ただし、簡単な解決策は次のとおりです。

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

私はあなたがこれを考えたと確信しています。しかし、良い方法ではないようです。

+0

それは役に立たないでしょう...質問は '(char)...'部分を持たないプログラムを書くことができますか? –

+0

直接的な方法はないと思います。 Javadocをチェックすることができます。それがないので、あなたが求めているものを得ることができません。 int型をcharに型変換する際の問題は何ですか?結局のところ、バイトコードは同じになります。 – Shakhar

+0

@MartinSchäf:いいえ。できません。 –

関連する問題