动态生成,编译,运行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 动态编译.java文件,动态运行类 _1.3
把.apk文件改名为.zip,然后解压缩,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件 2.把classes.dex拷贝到dex2jar.bat所在目录。 ...
动态编译字符串成java,并且添加class到jvm
有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。
java生成https安全证书,解决httpClient访问https出错 编译:javac InstallCert.java 运行:java InstallCert 要访问的网址 ...输入1确认生成jssecacerts文件,将证书copy到$JAVA_HOME/jre/lib/security目录下
网上找了很久没找到java在线编译系统的源码就...因为类名是 系统自动生成的 生成的 java class文件保存在c:/compile 如果要接收 控制台输入的参数 请在点运行前输入 。单击compile.jsp中的例子按钮 可以测试这个功能。
同时,在用户点击编译、运行等按钮时,会自动生成相应的CMD命令并通过对话框显示出来供用户确认,在方便用户编译的同时也可加深用户对编译具体操作的理解; 运行环境:本程序的原理为调用JDK和JRE,故需要用户自行...
本文详细介绍了如何使用java命令来运行已经编译好的Java程序,并附带示例源码和详细步骤。通过阅读本文,您将学习到以下内容: ...运行Java程序之前,确保已经成功编译了Java源代码并生成了相应的字节码文件。
通过脚本把protobuf文件一键生成.cs和java文件 1.目录介绍 bean:中间目录 code:生成的代码存放路径 tools:编译工具 gen_proto.bat:一键生成C#和java代码 Mid.proto:测试用的protobuf文件 2.使用方法 运行gen_...
当我们需要运行一个与其他jar文件有关联jar文件时,如果jar文件里面的MANIFEST.MF文件没有配置好,那在运行时就要报异常:Exception in thread "main" java.lang.NoClassDefFoundError。原因:未找到关联jar文件里面...
以我的为例,操作步骤如下: ... 此时E盘目录下会生成一个FileSa.java文件,源码尽现眼前。 注1:FilseSa是一个文件分割器; 注2:前提是你的机器上已经配好了JDK; 注3:要运行,在命令提示符中输入java FileSa即可
生成的 Exe 文件在执行时,需要 JRE(Java Runtime Environment)。 2. 用法及举例 本软件在控制台下运行,格式: D:\>J2E <jarfile> /m 说明: jarfile - 指定 jar 文件名 mainclass - 有静态 main() 方法的启动类...
1.首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的; 2.解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在...
当我们编写并编译Java代码后,生成的是字节码文件(.class文件)。而JRE就负责将这些字节码文件转换为机器能够执行的指令。它通过Java虚拟机来实现对字节码的解释或即时编译执行。 Java虚拟机是JRE中最重要的组成...
java反编译 ...生成的AutoR.java文件所在包名 RClassPackage = com.shengpay.tool # 是否需要替换代码 ReplaceCode = true Android App的gradle文件增加如下任务 //编译之前运行AutoR task autoR(type: Ex
./ant.sh build 编译src下所有cpp,在bin目录下生成对应的.o文件文件(类似java-classes生成规则),并链接,生成.bin文件 ./ant.sh run运行生成的.bin文件 ./ant.sh share自动将cpp打包成.so动态库。
写java程序的时候直接用记事本编,扩展名保存为".java" 然后直接把java文件拖拽到"神的旨意2.bat"上 马上出运行结果 (注意!是直接拖拽到"神的旨意"文件图标上,不需要打开任何东西 而且编译过程中不会生成class文件) ...
这两个程序的区别是,一个会把生成的class文件统一放到C盘,另一个是在当前目录下生成一个class文件夹,凭自己习惯选择使用吧,你当然也可以再Java文件打开方式中加入本程序,会更方便! Test.java是我编写的一个例...