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
相关推荐
在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...
Java动态编译是一种技术,允许程序在运行时将源代码转换为字节码并加载到JVM(Java虚拟机)中。这种能力使得Java应用程序能够根据需要编译和执行新的代码,增强了软件的灵活性和可扩展性。在给定的场景中,用户通过...
这个工具的核心功能是能够在运行时动态编译Java源代码并将其加载到Java虚拟机(JVM)中,从而实现对应用程序的即时修改和调试,而无需重新构建和部署整个项目。它特别强调了对“jar in jar”场景的支持,这意味着...
在Java编程中,动态加载JAR或ZIP包是一项重要的技术,它允许程序在运行时根据需求加载外部库,而不是在编译时静态地链接。这种技术对于实现插件化、模块化系统,或者处理频繁更新的组件非常有用。下面将详细讲解如何...
在Java开发中,JD-GUI提供了一个便捷的方式,让开发者能够快速查看和学习已编译的库或组件的内部工作原理,即使这些库或组件没有提供源代码。 要使用JD-GUI,首先你需要下载并安装这款工具。JD-GUI通常以跨平台的可...
要实现类的热加载,通常需要先动态编译修改后的源代码,生成新的字节码文件,然后使用自定义类加载器加载这个新版本的类。Java的`javac`工具可用于编译源代码,`ASM`或`Javassist`库可以方便地操作字节码。 5. ...
Java动态类加载机制是Java虚拟机(JVM)运行时的一个重要特性,它允许在程序...动态类加载的特性是Java语言的一个重要优势,它使得Java程序能够在运行时动态安装程序组件,这一点在现代软件开发中具有非常重要的价值。
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
总结,Java程序的编译、加载与执行是一个复杂而高效的过程,涵盖了编译器、JVM、类加载器、解释器、垃圾收集器等多个组件的协同工作。理解这一过程对于优化Java应用程序的性能和解决运行时问题至关重要。
Java类加载机制的原理是基于Java虚拟机的架构,Java虚拟机将Java类文件编译生成的.class文件加载到内存中,并将其转换为机器可执行的代码。类加载机制的过程可以分为三个阶段:加载、链接和初始化。 加载阶段:在...
Java使用了一种称为“类加载器”(ClassLoader)的系统组件来动态地加载类到Java虚拟机(JVM)。类加载器负责查找并加载类的字节码文件(.class文件),这些文件通常来自于JAR包。类加载的过程可以分为三个阶段:...
Java程序中的每个类和接口都被编译成独立的`.class`文件,这些文件作为Java运行环境的动态加载单元。 在Java中,类的加载分为**预先加载(pre-loading)**和**依需求加载(load-on-demand)**两种策略。预先加载...
4. **动态链接(Dynamic Linking)**:实现类的加载和链接,确保方法调用正确。 5. **方法区域(Method Area)**:存储类的信息、静态变量和常量池。 #### 反编译工具与技巧 反编译Java Class文件的常用工具包括但...
`java.lang` 包中的 `ClassLoader` 类是Java类加载的核心组件。它的主要职责是在接收到类请求时提供服务。具体而言,当 JVM 需要使用一个类时,它会向 `ClassLoader` 请求该类,随后 `ClassLoader` 尝试返回一个表示...
Java 类加载机制是 Java 虚拟机(JVM)的一部分,负责将编译后的 Java 字节码文件加载到 JVM 中,以便执行 Java 程序。类加载机制是 JVM 的核心组件之一,对 Java 程序的执行和安全性起着至关重要的作用。 类加载...
此外,Classpath变量用于指定Java加载类库的位置,包括当前目录(用"."表示)和上一级目录(用".."表示)。如果未设置Classpath,Java会默认搜索当前目录。 Java与C/C++相比,具有显著优势。C/C++需要程序员手动...
- **动态链接**:JVM支持类的动态加载和卸载,可以按需加载类文件,提高了程序的灵活性和性能。 #### 字节码(Bytecode)的特点与作用 字节码具有以下特点: - **平台无关性**:字节码是由JVM解释执行的,因此...
Java类加载机制是Java程序运行的关键部分,它使得程序能够在运行时动态加载和执行。类加载涉及多个步骤,包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化...
类加载器是一个系统组件,负责从指定的位置找到类的定义并将其转换为运行时的类对象。类加载器遵循双亲委派模型,这意味着当接收到加载请求时,加载器首先会将请求传递给其父加载器,只有当父加载器无法找到类时,...
Java加壳技术是一种保护Java程序不被轻易反编译或篡改的安全手段,它通过自定义类加载器来实现对原始字节码的包装。在Java中,类加载器是负责加载类到JVM(Java虚拟机)的核心组件。自定义类加载器允许开发者根据...