这样的事情:
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类文件然后运行它?
答案 0 :(得分:2)
是的,这是可能的。但不是你这样做的方式。
您不使用Writer编写二进制文件。如果你这样做,你可能最终得到一个损坏的文件...由于字符编码步骤损坏你的(二进制)数据。
使用OutputStream。
我不知道这是否是格式良好的字节码“文件”。我怀疑不是。它看起来已经被二进制错误 - &gt;文字“解码”。也可能是复制粘贴(参见@ Antimony的评论)。
假设您可以设法将格式良好的类文件添加到文件系统中,您可能仍然需要在加载之前实例化新的类加载器。如果您之前已加载该课程,情况肯定会如此。
更好的想法是创建一个自定义Classloader
类,并使用预计的defineClass
方法直接从内存中的字节数组加载该类。