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

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

    博客分类:
  • Java
阅读更多

 

在infoQ上找到一篇Java深度历险(一)——Java字节代码的操纵里关于jdk1.6中可以调用Java编译器API方式,比较有兴趣,其中的例子是用java编译器API实现了算术运算的例子。执行过程如下:

  1. 定义类的字符串表示。
  2. 编译类
  3. 加载编译后的类
  4. 实例化并进行调用。

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

 

 

 

 

分享到:
评论
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包就提示找不到
11 楼 gogole_09 2011-05-29  
Willam2004 写道
gogole_09 写道
Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下


好的,文波也开始研究这块了,不错哈.

^_^, 我只是过来学习学习,打打酱油而已。
10 楼 Willam2004 2011-05-27  
gogole_09 写道
Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下


好的,文波也开始研究这块了,不错哈.
9 楼 gogole_09 2011-05-27  
神之小丑 写道
这个,在eclipse下是要报错的吧
compiler 为null。。。
不能用IDE,只能用javac java

之前也碰到这个情况,你看一下你eclipse的jre路径,是不是指向/java/jre目录,
后面换成指到jdk/目录下面就可以了。
8 楼 gogole_09 2011-05-27  
Nice,
PS: wenshao开源的SimpleEL好像就是用JAVA编译器API来对生成的java源文件进行编译操作的,可以参考一下
7 楼 Willam2004 2011-05-14  
MrScott 写道
【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。

我没有这个电子书,我是在infoq上看的。^_^
6 楼 zk7019311 2011-05-10  
第一次听说
5 楼 timedifier 2011-05-10  
神之小丑 写道
这个,在eclipse下是要报错的吧

compiler 为null。。。

不能用IDE,只能用javac java

引入tool.jar包不就行了。。。
4 楼 Willam2004 2011-05-07  
神之小丑 写道
这个,在eclipse下是要报错的吧

compiler 为null。。。

不能用IDE,只能用javac java


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

compiler 为null。。。

不能用IDE,只能用javac java
2 楼 xiaoyuqi00 2011-05-04  
估计不是电子版,应该是纸质书。

JVM讲的比较好的,

我觉得是《深入java虚拟机》
1 楼 MrScott 2011-05-04  
【Java深度历险】电子版书,可以放出来吗? 这本书,很不错。对JVM讲述的很好。

相关推荐

    Java深度历险-完整版

    《Java深度历险》是一本全面探讨Java技术的书籍,主要关注Java虚拟机(JVM)的深入理解和相关概念。本书旨在帮助读者不仅掌握Java编程的基本语法,而且能够理解Java平台的工作原理,从而提升编程技能和解决问题的...

    java深度历险--学习深入了解java的好书

    《Java深度历险》是一本深入探讨Java技术的书籍,旨在帮助读者理解Java的内在机制,包括JVM(Java虚拟机)、JDK(Java开发工具包)和JRE(Java运行环境)之间的关系,以及类加载的过程等核心概念。通过这本书,你...

    java深度历险-王森

    《Java深度历险》是Java学习者的一本经典著作,由王森编著,深受广大编程爱好者喜爱。这本书深入浅出地讲解了Java语言的核心概念和技术,是初学者步入Java世界的理想指南。作为一本深度探索Java的书籍,它涵盖了从...

    java深度历险-深入讨论java

    《Java深度历险》是一本面向已有基础的Java程序员的高级读物,...通过深入学习和实践《Java深度历险》中的这些知识点,Java开发者可以提升自己的技术水平,更好地应对复杂项目和挑战,实现高效、稳定和可维护的代码。

    Java深度历险-让你了解JDK

    《Java深度历险》是一本旨在深入探索JDK和JVM内部运作的书籍,它将带你走过一场关于Java编程语言的精彩旅程。JDK(Java Development Kit)是开发和运行Java应用程序的基础,而JVM(Java Virtual Machine)则是Java...

    Java深度历险_Java深度历险

    《Java深度历险》这本书是Java开发者的一本深入学习指南,它涵盖了Java编程语言的核心概念、高级特性以及实际开发中的应用技巧。通过本书,读者可以系统地了解Java的各个方面,从而提升自己的编程技能和问题解决能力...

    java深度历险——王森

    关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的...推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

    Java深度历险完整版

    Java深度历险 深入Java 2 SDK 深入类别载入器 Java与MS Office 用Visual Studio.net操控Java虚拟机 package与import机制 Ant 附录A.Java 2 SDK原版码概观

    java深度历险.rar

    java深度历险.rarjava深度历险.rarjava深度历险.rarjava深度历险.rarjava深度历险.rar

    王森 Java深度历险

    通过阅读和实践,读者不仅可以理解Java的理论知识,还能掌握编写高质量Java代码的技巧。 总的来说,《王森 Java深度历险》是一本适合Java初学者的全方位指南,无论你是对编程感兴趣的学生,还是想要转行的工作者,...

    Java 深度历险.pdf

    《Java 深度历险》是一本专为Java开发者准备的深度学习书籍,它涵盖了Java编程语言的核心概念、高级特性以及实战应用。通过这本书,读者可以深入理解Java的内部机制,提升编程技能,实现从初级到高级的跨越。下面...

    Java深度历险

    ### Java深度历险——Java字节代码的操纵 #### 引言 随着Java技术的不断发展与完善,越来越多的开发者开始关注于如何更深入地理解Java内部机制及其高级特性。本篇将聚焦于Java字节码层面的操作,为读者提供一个...

    Java深度历险.pdf

    《Java深度历险.pdf》这份文档主要围绕Java技术的一些深入理解和...综上所述,《Java深度历险.pdf》详细介绍了Java技术的安装、配置、运行环境搭建以及JVM的理解和应用,为Java开发者提供了深入的学习资料和实践指南。

    java深度历险+深入java虚拟机

    《Java深度历险》与《深入Java虚拟机》是两本深受Java开发者喜爱的经典书籍,它们涵盖了Java编程语言和Java虚拟机(JVM)的高级主题,旨在帮助读者深入理解Java平台的工作原理。 《Java深度历险》这本书通常会涵盖...

    JAVA深度历险(PDF格式)

    《JAVA深度历险》是由知名Java专家王森撰写的一本深度探索Java编程的著作,PDF格式使得读者可以方便地在电子设备上阅读和学习。这本书是Java开发者提升技能、深化理解的重要参考资料,涵盖了从基础到高级的众多Java...

    java深度历险

    《Java深度历险》是一本面向已有一定Java基础的学习者,旨在深化理解并提升Java编程技能的专业书籍。作者王森,以其丰富的编程经验和深入的理解,为读者揭示了Java语言的精髓与复杂性,帮助程序员从初级阶段跨越到...

    java深度历险.pdf

    《Java深度历险》这本书主要探讨了Java编程语言的深度知识,涵盖了从早期版本到Java 2 SDK的演进历程。Java是由Sun Microsystems开发的一种高级编程语言,最初被称为OAK,后来发展为Java 1.0,并逐步演变为Java 1.1...

Global site tag (gtag.js) - Google Analytics