精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-02
最后修改:2011-05-02
在infoQ上找到一篇Java深度历险(一)——Java字节代码的操纵里关于jdk1.6中可以调用Java编译器API方式,比较有兴趣,其中的例子是用java编译器API实现了算术运算的例子。执行过程如下:
在eclipse下如果按照上述的方式进行调用,会在第三步中加载编译的类过程抛出“ClassNotFoundException”。因为默认的Eclipse的java工程编译后的文件是放在当前工程下的bin目录下。而第二步编译输出的路径是工程目录下,所以加载时会抛出类找不到的错误。
解决方案: Java编译器API实际上是调用系统环境中的javac命令,在终端下输入javac命令,会发现javac带有n多的参数,其中有一个是-d 可以指定编译后的class文件存放目录。但在java编译器的API是如何实现的呢?
可以在JavaCompiler的getTask方法进行设置:
CompilationTask getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits); 其中的options就是指定了javac的参数。具体使用如下:
public static CompilationTask getCompilationTask(String d, String source) throws URISyntaxException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); StringSourceJavaObject object = new CompilerRunTime.StringSourceJavaObject(d, source); Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(object); String flag = "-d"; String outDir = System.getProperty("user.dir") + "/" + "bin"; Iterable<String> stringdir = Arrays.asList(flag, outDir); //指定-d dir 参数 CompilationTask task = compiler.getTask(null, fileManager, null, stringdir, null, fileObjects); return task; }
可以看到JavaCompiler在获取Task时可以传入一定的参数,就可以指定编译的路径。 我在eclipse测试一下,测试成功。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-04
【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。
|
|
返回顶楼 | |
发表时间:2011-05-04
估计不是电子版,应该是纸质书。
JVM讲的比较好的, 我觉得是《深入java虚拟机》 |
|
返回顶楼 | |
发表时间:2011-05-05
最后修改:2011-05-05
这个,在eclipse下是要报错的吧
compiler 为null。。。 不能用IDE,只能用javac java |
|
返回顶楼 | |
发表时间:2011-05-07
神之小丑 写道 这个,在eclipse下是要报错的吧
compiler 为null。。。 不能用IDE,只能用javac java 应该不会的,这个特性在jdk1.6版本之后才有。 不知道ls具体的环境是怎么用的? |
|
返回顶楼 | |
发表时间:2011-05-10
神之小丑 写道 这个,在eclipse下是要报错的吧
compiler 为null。。。 不能用IDE,只能用javac java 引入tool.jar包不就行了。。。 |
|
返回顶楼 | |
发表时间:2011-05-10
第一次听说
|
|
返回顶楼 | |
发表时间:2011-05-14
MrScott 写道 【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。
我没有这个电子书,我是在infoq上看的。^_^ |
|
返回顶楼 | |
发表时间:2011-05-27
Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下 |
|
返回顶楼 | |
发表时间:2011-05-27
神之小丑 写道 这个,在eclipse下是要报错的吧
compiler 为null。。。 不能用IDE,只能用javac java 之前也碰到这个情况,你看一下你eclipse的jre路径,是不是指向/java/jre目录, 后面换成指到jdk/目录下面就可以了。 |
|
返回顶楼 | |