- 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文件的方法
最新推荐文章于 2024-07-01 09:05:11 发布