我有一个程序将字符串写入.java文件,使用javax.tools
将.java文件编译成.class文件,然后我使用修改后的ClassLoader尝试获取{{1类的实例(通过将其转换为字节数组并使用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();
}
}
答案 0 :(得分:2)
您的字节数组无效字节码。如果是,它将以魔术字符串(十六进制)0xCAFEBABE
开头。相反,你的第一个字节是1885430635
(十进制),它是十六进制0x7061636b
,它一次读取一个字节给出ASCII字符pack
,这只是包声明的开头
换句话说,您正在尝试加载文本文件,就好像它是字节码一样,显然Java不能从这样的字节流构造任何类。