动态生成,编译,运行java文件,jdk动态代理底层实现就是利用此方法,demo已上传。
package com.code.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class CodeGenerate {
/**
* 编译java类
* @param writerPath
*/
public void javac(String writerPath){
//java编译器
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//文件管理器,参数1:diagnosticListener 监听器,监听编译过程中出现的错误
StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null);
//java文件转换到java对象,可以是多个文件
Iterable<? extends JavaFileObject> it = manager.getJavaFileObjects(writerPath);
//编译任务,可以编译多个文件
CompilationTask t = compiler.getTask(null, manager, null, null, null, it);
//执行任务
t.call();
try {
manager.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 利用反射,实例化对象,此方法可指定class路径,放在classpath下可能会和jdk编译的文件冲突
* @param packPath
*/
public void java(String packPath){
URL[] urls = null;
try {
//类路径,url的本地文件格式需要加file:/
urls = new URL[] {new URL("file:/"+System.getProperty("user.dir")+"/src/")};
} catch (MalformedURLException e) {
e.printStackTrace();
}
//类加载器
URLClassLoader url = new URLClassLoader(urls);
Class clazz = null;
try {
//加载到内存
clazz = url.loadClass(packPath);
//实例化对象
clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读文件
* @param readerPath
* @return
*/
public BufferedReader fileReader(String readerPath){
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(readerPath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return br;
}
/**
* 写文件
* @param br
* @param writerPath
*/
public void fileWriter(BufferedReader br,String writerPath){
String line;
BufferedWriter bw = null;
try {
line = br.readLine();
bw = new BufferedWriter(new FileWriter(writerPath));
while(line != null){
bw.write(line+"\r\n");
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.flush();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.code.test;
import java.io.BufferedReader;
/**
* 测试类,注:eclipse设置中 运行环境设置为jdk,如果设置为jre无法编译成功。
* @author Administrator
*
*/
public class CodeTest {
//文件读取路径
private static final String READER_PATH = System.getProperty("user.dir")+"/codeFile/codeText.txt";
//文件输出路径
private static final String WRITER_PATH = System.getProperty("user.dir")+"/src/com/code/java/CodeText.java";
//包路径
private static final String PACK_PATH = "com.code.java.CodeText";
public static void main(String[] args) {
CodeGenerate code = new CodeGenerate();
//读文本文件
BufferedReader br = code.fileReader(READER_PATH);
//生成java类
code.fileWriter(br, WRITER_PATH);
//编译java类
code.javac(WRITER_PATH);
//运行java类
code.java(PACK_PATH);
}
};
package com.code.java;
/**
*
* txt文件中的动态类
*
*/
public class CodeText {
public CodeText() {
System.out.println("代码生成并且编译运行成功!");
}
};
分享到:
相关推荐
结合以上两个部分,我们可以在运行时动态编译Java源代码并生成JAR文件。这在实现某些动态加载或插件系统时非常有用。不过,实际应用中,我们还需要处理更复杂的情况,例如错误处理、资源清理以及编译多个源文件等。...
3. **设置编译任务**:创建一个`JavaFileObject`实例表示要编译的.java文件,然后使用`Iterable<JavaFileObject>`集合来包含这些文件。接下来,定义编译任务的选项,如源和目标版本。 ```java List<JavaFileObject> ...
创建一个`Iterable`对象,包含要编译的.java文件。假设我们有一个名为`MyClass.java`的文件,我们可以这样设置: ```java File sourceFile = new File("MyClass.java"); Iterable<? extends File> ...
但在某些场合,我们可能希望在程序运行时动态地编译新的.java文件,以便快速响应代码变动。 Java提供了一个名为`javax.tools.JavaCompiler`的API,它允许我们在程序运行时编译源代码。这个API是Java 6引入的,包含...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...
在Java编程环境中,有时...总结来说,编译和运行带有JAR包的Java程序涉及编译源代码、设置类路径、创建MANIFEST.MF文件指定主类、打包成JAR并最后运行JAR。通过使用IDE或构建工具,这个过程可以变得更加便捷和高效。
Java动态生成代码并编译载入是一个高级的编程技术,主要用于那些需要在应用程序运行时根据某些模板和数据动态地生成、编译和加载Java代码的场景。这种技术在需要高度定制化处理或是运行时参数化生成业务逻辑的系统中...
这里的`sourceFilePath`是待编译的.java文件路径。 3. **执行编译任务**:现在可以执行编译任务了,如果编译成功,会生成.class文件。 ```java boolean success = task.call(); if (success) { System.out....
在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...
### Java反编译工具:将.class文件转换为.java文件 #### 概述 在软件开发领域,有时我们可能需要分析第三方库或者开源项目的内部结构,这时就需要借助于反编译工具来帮助我们阅读和理解其源码。Java作为一种广泛...
5. **分析与保存**:你可以分析反编译的源代码,但请注意,由于反编译过程的不完美性,生成的.java文件可能与原始源代码略有不同,例如变量名和注释可能会丢失。如果需要,可以通过“File”菜单选择“Save As...”...
Java动态编译指的是在程序运行时将Java源代码编译为字节码并加载到Java虚拟机(JVM)中的过程。这种技术在许多场景下非常有用,例如在开发环境中进行快速迭代、AOP(面向切面编程)或运行时代码生成等。Java的`javax...
### 命令行编译和运行Java类 在日常的软件开发过程中,开发者经常会遇到需要在命令行环境下编译和运行Java程序的情况。本文将详细介绍如何在DOS(Disk Operating System)环境下,通过命令行工具编译和运行Java程序...
例如,对于名为 `HelloWorld.java` 的源文件,我们会在命令行输入 `javac HelloWorld.java`,这将生成一个对应的 `HelloWorld.class` 文件。这个过程中,Java编译器会将源代码转换为字节码,这是一种平台无关的中间...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失或不可用,反编译工具就能派上用场。这些工具可以帮助开发者理解代码的功能,修复错误,...
Java开发过程中,有时我们需要查看或理解已编译的Class文件中的源代码,因为Java的编译过程会将源代码转化为字节码(.class文件)。在这种情况下,反编译工具就派上了用场。本篇文章将详细介绍Java的jar反编译工具...
在Java编程语言中,.class文件是Java源代码编译后的二进制形式,它包含了机器可执行的字节码。然而,有时我们可能需要查看这些编译后的代码,以便理解或逆向工程一个已存在的Java应用。这就是`.class`文件反编译成`....
在DOS命令行模式下编译Java文件或工程是开发者必备的基本技能,尤其对于那些习惯于命令行操作或者需要在没有图形用户界面的环境中工作的人员来说。以下将详细阐述如何在DOS环境下编译单个Java文件以及整个Java工程。...