`

Java 动态编译组件 & 类动态加载

    博客分类:
  • Java
 
阅读更多

1、JDK6 动态编译组件

  Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序。该包中提供主要类可以从 Java String、StringBuffer 或其他 CharSequence 中获取源代码并进行编译。接下来通过代码一步步讲述如何利用 JDK6 特性进行运行时编译。

复制代码
 // 通过 ToolProvider 取得 JavaCompiler 对象,JavaCompiler 对象是动态编译工具的主要对象
 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

 // 通过 JavaCompiler 取得标准 StandardJavaFileManager 对象,StandardJavaFileManager 对象主要负责
 // 编译文件对象的创建,编译的参数等等,我们只对它做些基本设置比如编译 CLASSPATH 等。
 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 

 // 因为是从内存中读取 Java 源文件,所以需要创建我们的自己的 JavaFileObject,即 InMemoryJavaFileObject 
 JavaFileObject fileObject = new InMemoryJavaFileObject(className, codeString); 
 Iterable<? extends JavaFileObject> files = Arrays.asList(fileObject); 

  // 从文件读取编译源代码
  //Files[] javafiles = ... ; // input for first compilation task
  //Iterable<? extends JavaFileObject> files = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(javafiles));

 // 编译结果信息的记录
 StringWriter sw = new StringWriter(); 

 // 编译目的地设置
 Iterable options = Arrays.asList("-d", classOutputFolder); 

 // 通过 JavaCompiler 对象取得编译 Task 
 JavaCompiler.CompilationTask task = 
 compiler.getTask(sw, fileManager, null, options, null, files); 

 // 调用 call 命令执行编译,如果不成功输出错误信息
 if (!task.call()) { 
 String failedMsg = sw.toString(); 
 System.out.println(“Build Error:” + failedMsg); 
 } 

 // 自定义 JavaFileObject 实现了 SimpleJavaFileObject,指定 string 为 java 源代码,这样就不用将源代码
 // 存在内存中,直接从变量中读入即可。
 public static class InMemoryJavaFileObject extends SimpleJavaFileObject { 
   private String contents = null; 

   public InMemoryJavaFileObject(String className, String contents) { 
     super(URI.create("string:///" + className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); 
     this.contents = contents; 
   } 

   public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { 
     return contents; 
   } 
 } 
复制代码

http://www.ibm.com/developerworks/cn/java/j-lo-jdk6forosgi/

http://www.ibm.com/developerworks/cn/java/j-lo-jse64/index.html?S_TACT=105AGX52&S_CMP=techcto

http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html

http://dlc.sun.com.edgesuite.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html/zh_CN/api/javax/tools/JavaCompiler.html

分享到:
评论

相关推荐

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

    java动态编译 ,写了一个jsp在页面上编辑java代码,然后servlet动态编译并执行main方法

    Java动态编译是一种技术,允许程序在运行时将源代码转换为字节码并加载到JVM(Java虚拟机)中。这种能力使得Java应用程序能够根据需要编译和执行新的代码,增强了软件的灵活性和可扩展性。在给定的场景中,用户通过...

    Java 动态编译小工具

    这个工具的核心功能是能够在运行时动态编译Java源代码并将其加载到Java虚拟机(JVM)中,从而实现对应用程序的即时修改和调试,而无需重新构建和部署整个项目。它特别强调了对“jar in jar”场景的支持,这意味着...

    JAVA动态加载JAR zip包

    在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...

    java jar反编译工具 java Class反编译工具

    在Java开发中,JD-GUI提供了一个便捷的方式,让开发者能够快速查看和学习已编译的库或组件的内部工作原理,即使这些库或组件没有提供源代码。 要使用JD-GUI,首先你需要下载并安装这款工具。JD-GUI通常以跨平台的可...

    Java之——类热加载

    要实现类的热加载,通常需要先动态编译修改后的源代码,生成新的字节码文件,然后使用自定义类加载器加载这个新版本的类。Java的`javac`工具可用于编译源代码,`ASM`或`Javassist`库可以方便地操作字节码。 5. ...

    Java动态类加载机制应用研究.pdf

    Java动态类加载机制是Java虚拟机(JVM)运行时的一个重要特性,它允许在程序...动态类加载的特性是Java语言的一个重要优势,它使得Java程序能够在运行时动态安装程序组件,这一点在现代软件开发中具有非常重要的价值。

    类加载器(java)

    Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...

    Java程序的编译、加载与执行.zip

    总结,Java程序的编译、加载与执行是一个复杂而高效的过程,涵盖了编译器、JVM、类加载器、解释器、垃圾收集器等多个组件的协同工作。理解这一过程对于优化Java应用程序的性能和解决运行时问题至关重要。

    深入研究Java的类加载机制.pdf

    Java类加载机制的原理是基于Java虚拟机的架构,Java虚拟机将Java类文件编译生成的.class文件加载到内存中,并将其转换为机器可执行的代码。类加载机制的过程可以分为三个阶段:加载、链接和初始化。 加载阶段:在...

    java 类从哪个jar包加载的

    Java使用了一种称为“类加载器”(ClassLoader)的系统组件来动态地加载类到Java虚拟机(JVM)。类加载器负责查找并加载类的字节码文件(.class文件),这些文件通常来自于JAR包。类加载的过程可以分为三个阶段:...

    JAVA类加载

    Java程序中的每个类和接口都被编译成独立的`.class`文件,这些文件作为Java运行环境的动态加载单元。 在Java中,类的加载分为**预先加载(pre-loading)**和**依需求加载(load-on-demand)**两种策略。预先加载...

    javaClass反编译.pdf

    4. **动态链接(Dynamic Linking)**:实现类的加载和链接,确保方法调用正确。 5. **方法区域(Method Area)**:存储类的信息、静态变量和常量池。 #### 反编译工具与技巧 反编译Java Class文件的常用工具包括但...

    Java加载。jar包

    `java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求时提供服务。具体而言,当 JVM 需要使用一个类时,它会向 `ClassLoader` 请求该类,随后 `ClassLoader` 尝试返回一个表示...

    java类加载机制原理与实现

    Java 类加载机制是 Java 虚拟机(JVM)的一部分,负责将编译后的 Java 字节码文件加载到 JVM 中,以便执行 Java 程序。类加载机制是 JVM 的核心组件之一,对 Java 程序的执行和安全性起着至关重要的作用。 类加载...

    java编译和运行

    此外,Classpath变量用于指定Java加载类库的位置,包括当前目录(用"."表示)和上一级目录(用".."表示)。如果未设置Classpath,Java会默认搜索当前目录。 Java与C/C++相比,具有显著优势。C/C++需要程序员手动...

    JAVA文件编译执行与虚拟机(JVM)介绍

    - **动态链接**:JVM支持类的动态加载和卸载,可以按需加载类文件,提高了程序的灵活性和性能。 #### 字节码(Bytecode)的特点与作用 字节码具有以下特点: - **平台无关性**:字节码是由JVM解释执行的,因此...

    深入理解java类加载机制

    Java类加载机制是Java程序运行的关键部分,它使得程序能够在运行时动态加载和执行。类加载涉及多个步骤,包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化...

    03Java虚拟机是如何加载Java类的1

    类加载器是一个系统组件,负责从指定的位置找到类的定义并将其转换为运行时的类对象。类加载器遵循双亲委派模型,这意味着当接收到加载请求时,加载器首先会将请求传递给其父加载器,只有当父加载器无法找到类时,...

    Java加壳源码-自定义类加载器

    Java加壳技术是一种保护Java程序不被轻易反编译或篡改的安全手段,它通过自定义类加载器来实现对原始字节码的包装。在Java中,类加载器是负责加载类到JVM(Java虚拟机)的核心组件。自定义类加载器允许开发者根据...

Global site tag (gtag.js) - Google Analytics