パケットキャプチャ中に記録されたイベントを再生するコードジェネレータを作成しています。
JVMはかなり制限されています-結局のところ。メソッドのサイズは64KBを超えることはできません。そこで、コードジェネレーターでJavaメソッドを分割するために、あらゆる種類のトリックを追加しました。
しかし今、私は新しい問題を抱えています。私はいくつかのbyte[]配列を取得し、それらをクラス内の静的変数にしました。例:
public class myclass {
private static byte[] byteArray = { 0x3c, 0x3f, ...
...
};
private static byte[] byteArray2 = { 0x1a, 0x20, ...
...
};
...
private static byte[] byteArray_n = { 0x0a, 0x0d, ...
...
};
}
「静的初期化子のコードが65535バイトの制限を超えています」というエラーが表示されます。
外部ファイルを持ってそこからデータを読みたくありません。単一のファイルで生成されたコードを使用したい。
私に何ができる?クラスの外で配列を宣言できますか?または、値128〜255にUnicodeの文字列を使用する必要がありますか(たとえば、(byte)0x9cの代わりに\ u009c)?それとも、静的に初期化されたデータを使用したいのは、現在世界で私だけですか?
アップデート
私が現在使用している手法は、次のような関数の自動作成です。
private byte[] byteArray_6() {
String localString = "\u00ff\u00d8\u00ff\u00e0\u0000\u0010JFIF\u0000" +
"(0%()(\u00ff\u00db\u0000C\u0001\u0007\u0007\u0007\n\u0008\n\u0013\n" +
"\u0000\u00b5\u0010\u0000\u0002\u0001\u0003\u0003\u0002\u0004\u0003";
byte[] localBuff = new byte[ localString.length() ];
for ( int localInt = 0; localInt < localString.length(); localInt++ ) {
localBuff[localInt] = (byte)localString.charAt(localInt);
}
return localBuff;
}
注:Javaは驚くべきことを続けています。0〜255の範囲のすべての値を\ u00XX(XXは2文字の16進表現)としてエンコードできると思います。しかし、あなたは間違っているでしょう。Javaコンパイラは、実際には\u000Aをコード内のリテラル「\n」と見なします。これにより、ソースコードのコンパイルが中断されます。したがって、文字列にはUnicodeエスケープを使用できますが、\u000aと\u000dの代わりにそれぞれ「\n」と「\r」を使用する必要があります。また、6文字のUnicodeエスケープ表現の代わりに、文字列に印刷可能な文字を入れても問題ありません。