gpt4 book ai didi

java - 使用适当的编码进行内部编译?

转载 作者:行者123 更新时间:2023-11-30 09:29:10 25 4
gpt4 key购买 nike

我有一个将字符串写入 .java 文件的程序,使用 javax.tools将该 .java 文件编译成 .class 文件,然后我使用修改后的 ClassLoader 尝试获取 Runnable类的实例(通过将其转换为字节数组并使用 ClassLoader.defineClass 获取实例)。但是..,我遇到了问题。当程序试图获取该类的一个实例时,它注意到它没有以正确的方式编译。我得到一个ClassFormatError上面写着 Incompatible magic value 1885430635 in class file <Unknown> .这是我的(目前相当草率的)代码:

import java.io.*;
import java.security.SecureClassLoader;

public class EnhancedClassLoader extends SecureClassLoader
{
public Object createObjectFromFile(String fileName) throws
InstantiationException, IOException, IllegalAccessException
{
File file = new File(fileName);
definePackage("compClassPack", null, null, null, null, null, null, file.toURI().toURL());
byte[] classBytes = null;
//ReadFileToByteArray
{
FileInputStream fis = new FileInputStream(file);
int size = (int)file.length();
classBytes = new byte[size];
int offset = 0;
int readed;
while (offset < size && (readed = fis.read(classBytes, offset, size - offset)) != -1)
{
offset += readed;
}
fis.close();
}
Class<?> clazz = defineClass(null, classBytes, 0, classBytes.length);
//The error is thrown here! ^^^

return clazz.newInstance();
}
}

.

import java.io.*;
import javax.tools.*;

public class Main
{
public static void main(String[] args)throws Exception
{
File file = new File("Sample.java");
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);

String code =
"package compClassPack;\n" +
"public class Sample implements Runnable\n" +
"{\n" +
" public Sample(){}\n\n" +
" public static void main(String[] args)\n" +
" {\n" +
" new Sample().run();\n" +
" }\n\n" +
" public void run()\n" +
" {\n" +
" System.out.println(\"It worked! :D\");\n" +
" }\n" +
"}";

for(byte ch : code.getBytes())
{
if((char)ch!='\n')
bw.write((char)ch);
else
bw.newLine();
}
bw.flush();
bw.close();

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(file);
JavaCompiler.CompilationTask ct = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
ct.call();

for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics())
System.out.format("Error on line %d in %d%n",
diagnostic.getLineNumber(),
((FileObject)diagnostic.getSource()).toUri());

fileManager.close();

EnhancedClassLoader loader = new EnhancedClassLoader();
Runnable runs = (Runnable) loader.createObjectFromFile(file.getAbsolutePath());
runs.run();
}
}

最佳答案

您的字节数组不是有效的字节码。如果是,它将以神奇字符串(十六进制)0xCAFEBABE 开头。相反,您的第一个字节是 1885430635(十进制),它是十六进制 0x7061636b,一次读取一个字节给出 ASCII 字符 pack,这只是包声明的开始。

换句话说,您正在尝试加载一个文本文件,就好像它是字节码一样,显然 Java 不能从这样的字节流构造任何类。

关于java - 使用适当的编码进行内部编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13719338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com