CSDN博客

img oicqren

动态生成JAVA代码(二)

发表于2004/11/3 19:37:00  691人阅读

/*
 * 创建日期 2004-7-2
 * 创建人 HongSoft
 * 文件名 TestCompile.java
 */
package com.hongsoft.test;

import java.io.*;

//定制的类装入器
public class TestCompile extends ClassLoader
{
 String _compiler;
 String _classpath;

 public static void main(String[] args)
 {

  new TestCompile();
 }

 public TestCompile()
 {
  super(ClassLoader.getSystemClassLoader());
  //默认编译器
  if (_compiler == null)
   _compiler = "D://j2sdk1.4.2//bin//javac";

  _classpath = ".";
  String extraclasspath =
   "c://Program Files//Java//j2re1.4.2//lib//rt.jar";
  // = System.getProperty("calc.classpath");
  if (extraclasspath != null)
  {
   _classpath =
    _classpath
     + System.getProperty("path.separator")
     + extraclasspath;
  }
  compile();
 }

 public void compile()
 {    
  String filename = "";
  String classname = "";
  try
  {
   //创建临时文件
   File javafile =
    File.createTempFile("compiled_", ".java", new File("."));
   filename = javafile.getName();
   classname = filename.substring(0, filename.lastIndexOf("."));
   generateJavaFile(javafile, classname);
   //编译文件
   invokeCompiler(javafile);
   //创建java类
   byte[] buf = readBytes(classname + ".class");
   Class c = defineClass(buf, 0, buf.length);
   try
   {
       c.newInstance();
   }
   catch (IllegalAccessException e)
   {
    throw new RuntimeException(e.getMessage());
   }
   catch (InstantiationException e)
   {
    throw new RuntimeException(e.getMessage());
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException(e.getMessage());
  }
 }

 //生成java文件
 void generateJavaFile(File javafile, String classname) throws IOException
 {
  FileOutputStream out = new FileOutputStream(javafile);
  String text =
   "public class "
    + classname
    + " {"
    + " public int getCreater() {return 1;}"
    + "}";
  out.write(text.getBytes());
  out.close();
 }

 //编译java文件
 void invokeCompiler(File javafile) throws IOException
 {
  String[] cmd =
   { _compiler, "-classpath", _classpath, javafile.getName()};
  //执行编译命令
  //A1:
  Process process = Runtime.getRuntime().exec(cmd);
  try
  { //等待编译器结束
   process.waitFor();
  }
  catch (InterruptedException e)
  {
  }
  int val = process.exitValue();
  if (val != 0)
  {
   throw new RuntimeException("编译错误:" + "错误代码" + val);
  }
 }

 //以byte数组形式读入类文件
 byte[] readBytes(String filename) throws IOException
 {
   File classfile = new File(filename);
  byte[] buf = new byte[(int) classfile.length()];
  FileInputStream in = new FileInputStream(classfile);
  in.read(buf);
  in.close();
  return buf;
 }

}

阅读全文
0 0

相关文章推荐

img
取 消
img