是否可以编写java类文件然后运行它

时间:2018-03-01 02:23:56

标签: java file .class-file

这样的事情:

import java.io.File;
import java.io.FileWriter; 
import java.io.IOException;
public class WriteClassFile
{
    public static void main(String args[]) throws IOException
    {
        File file = new File("ClassFile.class");
        file.createNewFile();
        FileWriter writer = new FileWriter(file);
        writer.write(getFileText());
        writer.flush();
        writer.close();
        ClassFile classFile = new ClassFile();
        classFile.print();
    }
    public static String getFileText()
    {
        return "Êþº¾   4 

     <init> ()V Code LineNumberTable print 
SourceFile ClassFile.java      Works        ClassFile java/lang/Object java/lang/System out Ljava/io/PrintStream; java/io/PrintStream (Ljava/lang/String;)V !                       *· ±    
                   %        ² ¶ ±    

            ";
    }
}

public class ClassFile
{
    public void print()
    {
        System.out.print("Works");
    }
}

我试过runnng这个,但是我得到了一个非法的字符例外。是否可以编写java类文件然后运行它?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。但不是你这样做的方式。

  1. 您不使用Writer编写二进制文件。如果你这样做,你可能最终得到一个损坏的文件...由于字符编码步骤损坏你的(二进制)数据。

    使用OutputStream。

  2. 我不知道这是否是格式良好的字节码“文件”。我怀疑不是。它看起来已经被二进制错误 - &gt;文字“解码”。也可能是复制粘贴(参见@ Antimony的评论)。

  3. 假设您可以设法将格式良好的类文件添加到文件系统中,您可能仍然需要在加载之前实例化新的类加载器。如果您之前已加载该课程,情况肯定会如此。

  4. 更好的想法是创建一个自定义Classloader类,并使用预计的defineClass方法直接从内存中的字节数组加载该类。