}
//主函数在线JAVA编译器源代码 , 程序入口点
public static void main(String s[])
{
new NotePad();
}
}
如何用maven将java8写的代码编译为java6平台的在一般的Java应用开发过程中,开发人员使用Java的方式比较简单 。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了 。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class) 。Java虚拟机(JVM)会负责把Java字节代码加载并执行 。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标 。Java类文件中包含的字节代码可以被不同平台上的JVM所使用 。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中 。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类 。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改 。这个时候就需要用到本文中将要介绍的相关技术 。首先介绍一下如何动态编译Java源文件 。
动态编译Java源文件
在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译 。对有些应用来说,Java源代码的内容在运行时刻才能确定 。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行 。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定 。在动态编译Java源文件时 , 使用的做法是直接在程序中调用Java编译器 。
JSR 199引入了Java编译器API 。如果使用JDK 6的话,可以通过此API来动态编译Java代码 。比如下面的代码用来动态编译最简单的Hello World类 。该Java类的代码是保存在一个字符串中的 。
01public class CompilerTest {
02public static void main(String[] args) throws Exception {
03String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07Iterable extends JavaFileObject fileObjects = Arrays.asList(sourceObject);
08CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09boolean result = task.call();
10if (result) {
11System.out.println("编译成功 。");
12}
13}
14
15static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17private String content = null;
18public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20this.content = content;
21}
22
23public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24return content;
25}
26}
27}
如果不能使用JDK 6提供的Java编译器API的话,可以使用JDK中的工具类com.sun.tools.javac.Main,不过该工具类只能编译存放在磁盘上的文件,类似于直接使用javac命令 。
另外一个可用的工具是Eclipse JDT Core提供的编译器 。这是Eclipse Java开发环境使用的增量式Java编译器 , 支持运行和调试有错误的代码 。该编译器也可以单独使用 。Play框架在内部使用了JDT的编译器来动态编译Java源代码 。在开发模式下,Play框架会定期扫描项目中的Java源代码文件,一旦发现有修改,会自动编译 Java源代码 。因此在修改代码之后,刷新页面就可以看到变化 。使用这些动态编译的方式的时候,需要确保JDK中的tools.jar在应用的 CLASSPATH中 。
推荐阅读
- redisshell执行,rediscli执行命令
- 泉州正版用友erp管理系统费用,用友erp软件多少钱一套
- 文件上传模块python,pythonftp上传文件
- ios15有什么坏处,ios15有什么不好
- java输出简单语句代码,java输出简单语句代码有哪些
- 游戏王格斗英雄合体卡,游戏王实体卡英雄卡组
- java中国象棋演示代码,用java编写中国象棋棋盘
- php数据库无法浏览 php数据库无法浏览怎么解决
- gis中平移功能在哪里,arcgis如何平移坐标