动态生成JAVA代码(二)

转载 2004年11月03日 19:37:00

/*
 * 创建日期 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;
 }

}

动态生成JAVA代码(二)

/*?* 创建日期 2004-7-2?* 创建人 HongSoft?* 文件名 TestCompile.java?*/package com.hongsoft.test; import java.io...
  • hongbo781202
  • hongbo781202
  • 2004年07月05日 17:24
  • 1493

动态生成JAVA代码(二)

/*?* 创建日期 2004-7-2?* 创建人 HongSoft?* 文件名 TestCompile.java?*/package com.hongsoft.test; import java....
  • techcrunch
  • techcrunch
  • 2008年04月09日 02:00
  • 236

动态生成JAVA代码

  • zgqtxwd
  • zgqtxwd
  • 2008年04月25日 18:54
  • 81

动态生成JAVA代码

动态生成JAVA代码 BCEL即Bytecode Engineering Library,它是一个第三方的字节码生成库,能帮助我们在内存中直接生成Java字节码。BCEL是一个源代码开放的免费代码...
  • techcrunch
  • techcrunch
  • 2008年04月09日 02:00
  • 142

四种动态生成Java代码的方法(一)

 摘要: 本文介绍了如何在普通Java程序中应用代码动态生成技术,并测试、比较了各种实现方法的性能。 提纲: 一、概述 / 二、表达式计算器 / 三、解释法 四、解析法 / 五、编译法 / 六、生成法...
  • oicqren
  • oicqren
  • 2004年11月03日 19:40
  • 1010

代码动态生成利器ASM

作者简介薛谷雨,NORDSAN(北京)信息科技开发有限公司高级JAVA研发工程师,正致力于企业级异构数据交换的服务器产品的研发,在J2EE和WEB SERVICE方面有较为丰富的开发经验,您可以通过r...
  • rainight
  • rainight
  • 2004年09月22日 10:26
  • 8415

四种动态生成Java代码的方法(二)

五、编译法 为了进一步优化表达式计算器的性能,我们要直接编译表达式——先根据表达式的逻辑动态生成Java代码,然后执行动态生成的Java代码,这种方法可以称之为编译法。 把后缀表达式翻译成Java表达...
  • oicqren
  • oicqren
  • 2004年11月03日 19:42
  • 1309

动态生成JAVA代码(三)

该例不是直接使用javac,而是使用tools.jar /*?* 创建日期 2004-7-2?* 创建人 HongSoft?* 文件名 TestCompile.java?*/package com.h...
  • hongbo781202
  • hongbo781202
  • 2004年07月05日 18:06
  • 1456

动态生成JAVA代码(一)

BCEL即Bytecode Engineering Library,它是一个第三方的字节码生成库,能帮助我们在内存中直接生成Java字节码。BCEL是一个源代码开放的免费代码库(http://sour...
  • oicqren
  • oicqren
  • 2004年11月03日 19:35
  • 752

动态生成JAVA代码(三)

该例不是直接使用javac,而是使用tools.jar /*?* 创建日期 2004-7-2?* 创建人 HongSoft?* 文件名 TestCompile.java?*/package com...
  • techcrunch
  • techcrunch
  • 2008年04月09日 02:00
  • 136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态生成JAVA代码(二)
举报原因:
原因补充:

(最多只允许输入30个字)