`
mengqingyu
  • 浏览: 328544 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

动态生成、编译、运行java文件

阅读更多
动态生成,编译,运行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

    java 动态编译.java文件,动态运行类 _1.3

    将apk文件反编译成java源码

    把.apk文件改名为.zip,然后解压缩,得到其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件 2.把classes.dex拷贝到dex2jar.bat所在目录。 ...

    动态编译字符串成java,并且添加class到jvm

    动态编译字符串成java,并且添加class到jvm

    Java动态生成代码并编译载入.pdf

    有时候需要在运行时根据模板和数据动态生成 Java 代码,然后对其进行编译生成 Class 文件,然后再将这些类加载 进去,并使用反射来创建对象。

    Java 生成证书工具类 https

    java生成https安全证书,解决httpClient访问https出错 编译:javac InstallCert.java 运行:java InstallCert 要访问的网址 ...输入1确认生成jssecacerts文件,将证书copy到$JAVA_HOME/jre/lib/security目录下

    java在线编译系统源码.rar

    网上找了很久没找到java在线编译系统的源码就...因为类名是 系统自动生成的 生成的 java class文件保存在c:/compile 如果要接收 控制台输入的参数 请在点运行前输入 。单击compile.jsp中的例子按钮 可以测试这个功能。

    Java快速编译工具

    同时,在用户点击编译、运行等按钮时,会自动生成相应的CMD命令并通过对话框显示出来供用户确认,在方便用户编译的同时也可加深用户对编译具体操作的理解; 运行环境:本程序的原理为调用JDK和JRE,故需要用户自行...

    Java零基础 - 使用java命令运行Java程序.md

    本文详细介绍了如何使用java命令来运行已经编译好的Java程序,并附带示例源码和详细步骤。通过阅读本文,您将学习到以下内容: ...运行Java程序之前,确保已经成功编译了Java源代码并生成了相应的字节码文件。

    protobuf转cs和java文件(一键生成)

    通过脚本把protobuf文件一键生成.cs和java文件 1.目录介绍 bean:中间目录 code:生成的代码存放路径 tools:编译工具 gen_proto.bat:一键生成C#和java代码 Mid.proto:测试用的protobuf文件 2.使用方法 运行gen_...

    Java程序创建Manifest文件

    当我们需要运行一个与其他jar文件有关联jar文件时,如果jar文件里面的MANIFEST.MF文件没有配置好,那在运行时就要报异常:Exception in thread "main" java.lang.NoClassDefFoundError。原因:未找到关联jar文件里面...

    反编译JAVA的class文件的简单方法,附"文件分割器"完整源代码

    以我的为例,操作步骤如下: ... 此时E盘目录下会生成一个FileSa.java文件,源码尽现眼前。 注1:FilseSa是一个文件分割器; 注2:前提是你的机器上已经配好了JDK; 注3:要运行,在命令提示符中输入java FileSa即可

    Java文件转换为 Exe 可执行文件

    生成的 Exe 文件在执行时,需要 JRE(Java Runtime Environment)。 2. 用法及举例 本软件在控制台下运行,格式: D:\&gt;J2E &lt;jarfile&gt; /m 说明: jarfile - 指定 jar 文件名 mainclass - 有静态 main() 方法的启动类...

    安卓反编译文件所用到的工具及方法

    1.首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的; 2.解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在...

    JAVA 运行环境安装包

    当我们编写并编译Java代码后,生成的是字节码文件(.class文件)。而JRE就负责将这些字节码文件转换为机器能够执行的指令。它通过Java虚拟机来实现对字节码的解释或即时编译执行。 Java虚拟机是JRE中最重要的组成...

    java反编译泄露源码-AutoR:编译时自动生成一个类似R.java的文件,编译入sdk,方便sdk以jar包+res的形式分发

    java反编译 ...生成的AutoR.java文件所在包名 RClassPackage = com.shengpay.tool # 是否需要替换代码 ReplaceCode = true Android App的gradle文件增加如下任务 //编译之前运行AutoR task autoR(type: Ex

    linux g++编译,链接助手

    ./ant.sh build 编译src下所有cpp,在bin目录下生成对应的.o文件文件(类似java-classes生成规则),并链接,生成.bin文件 ./ant.sh run运行生成的.bin文件 ./ant.sh share自动将cpp打包成.so动态库。

    JAVA代码+记事本 = <<傻瓜式编译运行>>

    写java程序的时候直接用记事本编,扩展名保存为".java" 然后直接把java文件拖拽到"神的旨意2.bat"上 马上出运行结果 (注意!是直接拖拽到"神的旨意"文件图标上,不需要打开任何东西 而且编译过程中不会生成class文件) ...

    Java快速命令编译助手(JCR)

    这两个程序的区别是,一个会把生成的class文件统一放到C盘,另一个是在当前目录下生成一个class文件夹,凭自己习惯选择使用吧,你当然也可以再Java文件打开方式中加入本程序,会更方便! Test.java是我编写的一个例...

Global site tag (gtag.js) - Google Analytics