动态生成JAVA代码(二)

原创 2004年07月05日 17:24: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....
  • oicqren
  • oicqren
  • 2004年11月03日 19:37
  • 698

动态生成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...
  • techcrunch
  • techcrunch
  • 2008年04月09日 02:00
  • 136

动态生成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
  • 751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态生成JAVA代码(二)
举报原因:
原因补充:

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