今天简单学习了下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());
}
}
分享到:
相关推荐
在 Java SE6 中,JavaCompiler 接口是 javax.tools 包的一部分,提供了标准的方式来操作 Java 编译器。 使用 JavaCompiler 接口来编译 Java 源程式是一种非常简单的方法。首先,我们可以通过 ToolProvider 类的静态...
这本书的下部主要涵盖了Java SE6中的核心概念、高级特性以及实战应用,旨在帮助开发者深入理解和充分利用这一版本的Java平台。 首先,书中详细介绍了Java SE6的类库增强,包括集合框架的改进,如泛型的全面引入,...
在提供的压缩包文件中,"内存中编译"和"Java6内存中动态编译案例"可能包含了一些实际操作的示例代码,这些代码可能演示了如何在内存中创建源代码字符串,然后使用`JavaCompiler`编译这些源代码,而无需将它们写入...
6. **改进的JDBC**:Java数据库连接(JDBC)API在Java 6中进行了增强,包括支持存储过程的输出参数、更好的结果集处理以及对批处理操作的支持。 7. **JVM优化**:Java虚拟机(JVM)在Java 6中进行了大量优化,包括...
《Java SE 6与HotSpot VM故障排除指南》是Oracle公司于2008年11月发布的一份技术文档,旨在帮助开发人员、系统管理员和技术支持人员解决在使用Java Standard Edition 6 (Java SE 6) 和HotSpot虚拟机过程中遇到的各种...
Java通过接口和抽象类支持多态,Java 6中,instanceof关键字可以用来检查对象是否属于特定类或其子类。 5. 接口:接口是一种完全抽象的类型,只包含常量和抽象方法。Java 6中,一个类可以实现多个接口,实现多继承...
3. **异常处理**:Java SE6中的异常处理是编程过程中必不可少的部分,源代码可能包含了try-catch-finally结构的示例,展示了如何捕获和处理运行时错误。 4. **输入输出流**:Java的I/O流系统用于读写文件、网络通信...
书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java虚拟机...
1. **泛型**:Java 6中的泛型允许开发者在类、接口和方法中声明类型参数,提高了代码的类型安全性,减少了强制类型转换,并提供了更好的编译时错误检查。例如,`List<String>`表明列表只能包含字符串对象。 2. **...
11. **JMX(Java Management Extensions)**:JMX在Java 6中得到了加强,可以更方便地监控和管理Java应用程序及运行时环境。 总的来说,Sun Java SE Runtime Environment 6是一个里程碑式的版本,它不仅提升了Java...
7. **JavaCompiler API**:Java SE6提供了一个新的JavaCompiler API,允许程序在运行时动态编译Java源代码,增强了代码的灵活性和动态性。 8. **改进的内存管理**:垃圾收集器在Java SE6中进行了优化,提供了并行和...
下面我们将详细探讨Java SE6中的关键知识点。 1. **泛型**:Java SE6对泛型进行了全面支持,允许在类、接口和方法中使用类型参数,从而增强了类型安全性和代码复用性。泛型可以防止在集合中插入不兼容的数据类型,...
1. **类文件结构**:Java源代码被编译成字节码,存储在类文件中。每个类文件包含元数据、方法和字段定义。了解类文件格式有助于理解JVM如何加载和执行字节码。 2. **字节码指令集**:JVM使用一套简单的指令集来执行...
在Java SE 7版本中,JVM进行了多项改进和增强,其中包括: 1. **动态类型语言支持**:Java 7引入了 invokedynamic 指令,这使得JVM能够更好地支持动态语言,如Groovy和JRuby。invokedynamic 提供了一种灵活的调用...
本文介绍了一种在Web环境下实现Java表达式的动态编译与计算的方法,该方法利用Java SE 6提供的编译器API实现动态编译,自定义类装载器装入字节代码,并使用反射机制调用计算方法,实现了Java表达式的动态编译与计算...
在Java SE 7版本中,JVM经历了一些重要的改进和优化,旨在提升性能、内存管理和安全性。 1. 类加载机制:JVM通过类加载器将类文件加载到内存中,这个过程包括加载、验证、准备、解析和初始化五个阶段。Java SE 7对...
**演示:** 在Java SE 6中,可以通过示例应用(如ScriptPad)演示如何执行JavaScript代码并调用Java方法。这些示例通常作为NetBeans项目随JDK一起提供,方便开发者进行测试和学习。 #### 2. Web服务支持 Java SE 6...
9. **动态代理**:Java 6的动态代理功能让开发者可以在运行时创建符合特定接口的新类,这对于实现AOP(面向切面编程)和其他设计模式很有帮助。 10. **安全增强**:Java SE 6在安全方面也有所改进,增强了Java插件...
第1章 :简单地介绍了Java虚拟机的历史并吹捧了←_← 一下Java的平台无关性(一次编译,到处运行); 第2章:概览Java虚拟机整体架构; 第3章:介绍如何将Java语言编写的程序转换为虚拟机指令集; 第4章:定义...
4. **实战项目**:可能包含一些实际的项目案例,让学习者在实践中掌握Java SE6的应用。 5. **测试题和解答**:用于检验学习效果,帮助巩固理论知识,并提供解题思路。 通过这份光盘内容,学习者不仅可以了解Java ...