`
liubuzhudeyun
  • 浏览: 12117 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java SE 6中的动态编译

    博客分类:
  • java
 
阅读更多
今天简单学习了下java SE下的动态编译方式,写了一个小小的demo,用来参考
public class JavaCompilerTest {

	/**
	 * @param args
	 *            main方法
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		test("Test.java");
	}

	/**
	 * @param clazzName
	 *            类名
	 * @throws Exception
	 *此处异常为了简便,只是简单抛出 读入一个java文件,并编译,加载类,生成对象,使用反射调用方法*/
	public static void test(String clazzName) throws Exception {
		// 使用StringBuilder来保存一个类,当然,也可以自己通过参数传过来
		// 使用StringBuilder的原因是StringBuilder比StringBuffer快,用于单线程情况
		// StringBuffer用于多线程安全的情况,详情见jdk文档
		StringBuilder str = new StringBuilder();
		str.append("public class Test {" + "\n");
		str.append("public void test() {" + "\n");
		str.append("System.out.println(\"Compiler success! \");" + "\n");
		str.append("}" + "\n");
		str.append("}");
		// 将java文件写入src文件夹下
		FileOutputStream fo = new FileOutputStream("src/" + clazzName);
		fo.write(str.toString().getBytes());// 直接写入文件
		fo.flush();
		fo.close();// 关闭流
		System.out.println(System.getProperty("user.dir"));
		// 获取编译器,如果使用eclipse开发工具,此处易报Nullpointer错误,解决方法见我的另一篇文章
		JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
		int state = 1;// 保存编译返回的状态,0编译成功,非0编译失败
		try {
			//编译类文件,输出到bin文件夹下
			state = javac.run(System.in, System.out, System.err, "-d",
					System.getProperty("user.dir") + "\\bin",
					System.getProperty("user.dir") + "\\src\\Test.java");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (state != 0) {
			System.out.println("compiler failed!");
			System.exit(0);
		}
		//通过类名加载类
		Class<?> clazz = Class.forName("Test");
		//获取类的方法,test方法无参数,所以getDeclaredMethod后面的参数省略
		Method method = clazz.getDeclaredMethod("test");
		//调用对应的方法
		method.invoke(clazz.newInstance());
	}
}

分享到:
评论

相关推荐

    JavaCompiler --JDK6 API的简介(java动态编译)

    在 Java SE6 中,JavaCompiler 接口是 javax.tools 包的一部分,提供了标准的方式来操作 Java 编译器。 使用 JavaCompiler 接口来编译 Java 源程式是一种非常简单的方法。首先,我们可以通过 ToolProvider 类的静态...

    Java SE6 技术手册(下)

    这本书的下部主要涵盖了Java SE6中的核心概念、高级特性以及实战应用,旨在帮助开发者深入理解和充分利用这一版本的Java平台。 首先,书中详细介绍了Java SE6的类库增强,包括集合框架的改进,如泛型的全面引入,...

    Java6动态编译案例

    在提供的压缩包文件中,"内存中编译"和"Java6内存中动态编译案例"可能包含了一些实际操作的示例代码,这些代码可能演示了如何在内存中创建源代码字符串,然后使用`JavaCompiler`编译这些源代码,而无需将它们写入...

    (Java SE 6 Downloads).zip

    6. **改进的JDBC**:Java数据库连接(JDBC)API在Java 6中进行了增强,包括支持存储过程的输出参数、更好的结果集处理以及对批处理操作的支持。 7. **JVM优化**:Java虚拟机(JVM)在Java 6中进行了大量优化,包括...

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    《Java SE 6与HotSpot VM故障排除指南》是Oracle公司于2008年11月发布的一份技术文档,旨在帮助开发人员、系统管理员和技术支持人员解决在使用Java Standard Edition 6 (Java SE 6) 和HotSpot虚拟机过程中遇到的各种...

    The Java Language Specification, Java SE 6 Edition.rar

    Java通过接口和抽象类支持多态,Java 6中,instanceof关键字可以用来检查对象是否属于特定类或其子类。 5. 接口:接口是一种完全抽象的类型,只包含常量和抽象方法。Java 6中,一个类可以实现多个接口,实现多继承...

    java SE6从入门到精通源代码

    3. **异常处理**:Java SE6中的异常处理是编程过程中必不可少的部分,源代码可能包含了try-catch-finally结构的示例,展示了如何捕获和处理运行时错误。 4. **输入输出流**:Java的I/O流系统用于读写文件、网络通信...

    Java虚拟机规范.Java SE 8版.zip

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java虚拟机...

    JAVA SE6.0 API文档

    1. **泛型**:Java 6中的泛型允许开发者在类、接口和方法中声明类型参数,提高了代码的类型安全性,减少了强制类型转换,并提供了更好的编译时错误检查。例如,`List&lt;String&gt;`表明列表只能包含字符串对象。 2. **...

    Sun Java SE Runtime Environment(JRE)6

    11. **JMX(Java Management Extensions)**:JMX在Java 6中得到了加强,可以更方便地监控和管理Java应用程序及运行时环境。 总的来说,Sun Java SE Runtime Environment 6是一个里程碑式的版本,它不仅提升了Java...

    JAVA SE6全方位学习 随书光盘

    7. **JavaCompiler API**:Java SE6提供了一个新的JavaCompiler API,允许程序在运行时动态编译Java源代码,增强了代码的灵活性和动态性。 8. **改进的内存管理**:垃圾收集器在Java SE6中进行了优化,提供了并行和...

    Java SE6 技术手册(上)

    下面我们将详细探讨Java SE6中的关键知识点。 1. **泛型**:Java SE6对泛型进行了全面支持,允许在类、接口和方法中使用类型参数,从而增强了类型安全性和代码复用性。泛型可以防止在集合中插入不兼容的数据类型,...

    java虚拟机规范 Java SE7

    1. **类文件结构**:Java源代码被编译成字节码,存储在类文件中。每个类文件包含元数据、方法和字段定义。了解类文件格式有助于理解JVM如何加载和执行字节码。 2. **字节码指令集**:JVM使用一套简单的指令集来执行...

    Java虚拟机规范(Java SE 7).pdf

    在Java SE 7版本中,JVM进行了多项改进和增强,其中包括: 1. **动态类型语言支持**:Java 7引入了 invokedynamic 指令,这使得JVM能够更好地支持动态语言,如Groovy和JRuby。invokedynamic 提供了一种灵活的调用...

    Web环境下Java表达式的动态编译与计算.pdf

    本文介绍了一种在Web环境下实现Java表达式的动态编译与计算的方法,该方法利用Java SE 6提供的编译器API实现动态编译,自定义类装载器装入字节代码,并使用反射机制调用计算方法,实现了Java表达式的动态编译与计算...

    Java虚拟机规范(Java SE 7)

    在Java SE 7版本中,JVM经历了一些重要的改进和优化,旨在提升性能、内存管理和安全性。 1. 类加载机制:JVM通过类加载器将类文件加载到内存中,这个过程包括加载、验证、准备、解析和初始化五个阶段。Java SE 7对...

    Java SE 6: Top 10 Features

    **演示:** 在Java SE 6中,可以通过示例应用(如ScriptPad)演示如何执行JavaScript代码并调用Java方法。这些示例通常作为NetBeans项目随JDK一起提供,方便开发者进行测试和学习。 #### 2. Web服务支持 Java SE 6...

    JAVA SE6.0编程指南源码

    9. **动态代理**:Java 6的动态代理功能让开发者可以在运行时创建符合特定接口的新类,这对于实现AOP(面向切面编程)和其他设计模式很有帮助。 10. **安全增强**:Java SE 6在安全方面也有所改进,增强了Java插件...

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...

    JAVA SE6全方位学习 光盘内容

    4. **实战项目**:可能包含一些实际的项目案例,让学习者在实践中掌握Java SE6的应用。 5. **测试题和解答**:用于检验学习效果,帮助巩固理论知识,并提供解题思路。 通过这份光盘内容,学习者不仅可以了解Java ...

Global site tag (gtag.js) - Google Analytics