内部编译与适当的编码?

时间:2012-12-05 08:51:19

标签: java encoding compiler-construction internal

我有一个程序将字符串写入.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();
    }
}

1 个答案:

答案 0 :(得分:2)

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

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