首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【Java深度历险-Java字节代码的操作】学习札记

2012-12-22 
【Java深度历险-Java字节代码的操作】学习笔记?在infoQ上找到一篇Java深度历险(一)——Java字节代码的操纵里关

【Java深度历险-Java字节代码的操作】学习笔记

?

在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测试一下,测试成功。

?

?

?

?

1 楼 MrScott 2011-05-04   【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。 2 楼 xiaoyuqi00 2011-05-04   估计不是电子版,应该是纸质书。

JVM讲的比较好的,

我觉得是《深入java虚拟机》 3 楼 神之小丑 2011-05-05   这个,在eclipse下是要报错的吧

compiler 为null。。。

不能用IDE,只能用javac java 4 楼 Willam2004 2011-05-07   神之小丑 写道这个,在eclipse下是要报错的吧

compiler 为null。。。

不能用IDE,只能用javac java

应该不会的,这个特性在jdk1.6版本之后才有。
不知道ls具体的环境是怎么用的? 5 楼 timedifier 2011-05-10   神之小丑 写道这个,在eclipse下是要报错的吧

compiler 为null。。。

不能用IDE,只能用javac java
引入tool.jar包不就行了。。。 6 楼 zk7019311 2011-05-10   第一次听说 7 楼 Willam2004 2011-05-14   MrScott 写道【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。
我没有这个电子书,我是在infoq上看的。^_^ 8 楼 gogole_09 2011-05-27   Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下 9 楼 gogole_09 2011-05-27   神之小丑 写道这个,在eclipse下是要报错的吧
compiler 为null。。。
不能用IDE,只能用javac java
之前也碰到这个情况,你看一下你eclipse的jre路径,是不是指向/java/jre目录,
后面换成指到jdk/目录下面就可以了。 10 楼 Willam2004 2011-05-27   gogole_09 写道Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下

好的,文波也开始研究这块了,不错哈. 11 楼 gogole_09 2011-05-29   Willam2004 写道gogole_09 写道Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下

好的,文波也开始研究这块了,不错哈.
^_^, 我只是过来学习学习,打打酱油而已。 12 楼 shixiuteng 2012-10-18   编译失败
E:\java\project\Test\src\com\time\GetTime.java:5: 软件包 org.apache.log4j 不存在
E:\java\project\Test\src\com\time\GetTime.java:7: 警告:com.sun.org.apache.bcel.internal.generic.NEW 是 Sun 的专用 API,可能会在未来版本中删除
E:\java\project\Test\src\com\time\GetTime.java:10: 找不到符号
符号: 类 Logger
位置: 类 com.time.GetTime
E:\java\project\Test\src\com\time\GetTime.java:10: 找不到符号
符号: 变量 Logger
位置: 类 com.time.GetTime
注意:E:\java\project\Test\src\com\time\GetTime.java 使用或覆盖了已过时的 API。
注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。



请问如果类引用jar包该怎么弄。现在如果调用jar包就提示找不到

热点排行