2

.jar から .class ファイルを抽出しようとしましたが、うまくいきましたが、何かを変更したところ、次のエラーが発生しました。

java.lang.ClassFormatError: Invalid constant pool index 63

これが私のコードです:

String path = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getFile()).getAbsolutePath();
if (path.endsWith("."))
    path = path.substring(0, path.length() - 1);
String decodedPath = URLDecoder.decode(path, "UTF-8");

File file = new File(decodedPath + (decodedPath.endsWith("\\") ? "Classfile.class" : "\\Classfile.class"));

InputStreamReader read = new InputStreamReader(FileSync.class.getResourceAsStream("/Classfile.class"));
FileWriter write = new FileWriter(file);

int c;
while ((i = read.read()) > -1) {
    write.write(i);
}
write.flush();
read.close();
write.close();

ProcessBuilder builder = new ProcessBuilder(System.getProperty("java.home") + "\\bin\\java.exe", "Classfile", decodedPath + (decodedPath.endsWith("\\") ? "Program.jar" : "\\Program.jar"));
builder.directory(file.getParentFile());
Process process = builder.start();

誰でも助けることができますか?

4

1 に答える 1

3

InputStreamReaderFileWriter暗黙的なバイト <-> char 変換を行います。Java クラス ファイルはバイナリ ファイルであるため、 および を介して raw バイトを使用しFileInputStreamますFileOutputStream

おそらく、16 進エディタを使用して書き込みの前後にクラス ファイルを開いて、新しいクラス ファイルに何が欠けているか、または何が追加されているかを確認できます。

于 2013-01-31T16:48:59.860 に答える