1.环境
JDK6
2.代码
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import com.yuan.common.file.DefaultFilenameFilter;
public class CompileUtil {
private static String JAVA_SOURCE_FILE = "d:/DynamicObject.java";
private static String JAVA_CLASS_NAME = "DynamicObject";
private static List<File> sourceList = new ArrayList<File>(); //源文件列表
private static final String BASEPATH = "d:/tmp";
public static synchronized void defaultCompile(String basePath)throws Exception{
File f = new File(basePath);
String sourcePath = f.getAbsolutePath()+File.separator+"src";
String targetPath = f.getAbsolutePath()+File.separator+"bin";
String libPath = f.getAbsolutePath()+File.separator+"lib";
compilePackage(sourcePath,targetPath,libPath);
}
/**
* 编译包及其子包
* @param sourcePath String
* @param targetPath String 编译后的类文件的输出文件夹
* @param libPath String 放置第三方类库的文件夹
* @throws Exception
*/
public static synchronized void compilePackage(String sourcePath , String targetPath , String libPath)throws Exception{
sourceList.clear();
compileSourceFile(getSourceList(sourcePath),targetPath,libPath);
}
private static List<File> getSourceList(String dirPath)throws Exception{
File dir = new File(dirPath);
File[] files = dir.listFiles(new DefaultFilenameFilter("java"));
for(File f:files){
if(f.isDirectory()){//如果是文件夹则迭代
getSourceList(dirPath+File.separator+f.getName());
}else{
sourceList.add(f);
}
}
return sourceList;
}
/**
* 编译单个Java源文件
* @param fileName String
* @param targetPath String
* @param libPath String
*/
public static void compileSourceFile(final String fileName , String targetPath , String libPath){
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
try {
Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(fileName);
compiler.getTask(null, fileManager, null, getCompileOptions(targetPath,libPath), null, sourcefiles).call();
fileManager.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* @param files List<File>
* @param targetPath String 目标文件夹
* @param libPath String 放置第三方类库的文件夹
*/
private static void compileSourceFile(List<File> files , String targetPath , String libPath){
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
try {
Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjectsFromFiles(files);
compiler.getTask(null, fileManager, null, getCompileOptions(targetPath,libPath), null, sourcefiles).call();
fileManager.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 设置编译选项
* @param targetPath String
* @param libPath String
* @return
*/
private static Iterable<String> getCompileOptions(String targetPath , String libPath){
List<String> options = new ArrayList<String>();
//设置编译后生成的类文件的输出目录
if(targetPath != null){
options.add("-d");
options.add(targetPath);
}
//设置用到的第三方类库的目录
if(libPath != null){
options.add("-classpath");
options.add(getLibStr(libPath));
}
return options;
}
private static String getLibStr(String libPath){
StringBuffer sb = new StringBuffer();
File libDir = new File(libPath);
File[] jarFiles = libDir.listFiles(new DefaultFilenameFilter("jar"));
for(File f:jarFiles){
if(!f.isDirectory()){
sb.append(libPath+File.separator+f.getName()+";"); //多个jar文件用分号隔开
}
}
return sb.substring(0, sb.lastIndexOf(";"));
}
}
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import com.yuan.common.util.AssertUtil;
public class DefaultFilenameFilter implements FilenameFilter {
private boolean ignoreDir = false; //是否忽略文件夹,默认不忽略
private List<String> extList = new ArrayList<String>();
public DefaultFilenameFilter(final String ext){
this.extList.add("."+ext);
}
public DefaultFilenameFilter(final String... exts){
if((exts != null) && (exts.length > 0)){
for(String ext : exts){
this.extList.add("."+ext);
}
}
}
public DefaultFilenameFilter(final String ext, boolean ignoreDir){
this.ignoreDir = ignoreDir;
this.extList.add("."+ext);
}
public void addExt(final String ext){
this.extList.add("."+ext);
}
public boolean accept(File dir, String name) {
if(ignoreDir){
if(new File(dir+File.separator+name).isDirectory()){
return false;
}else{
return endsWithExt(name);
}
}else{
return endsWithExt(name)||new File(dir+File.separator+name).isDirectory();
}//if
}//accept
protected boolean endsWithExt(String name){
if(!AssertUtil.notEmpty(extList)){
return true;
}
for(String ext : extList){
if(name.endsWith(ext)){
return true;
}
}
return false;
}
}
import java.util.Collection;
import java.util.Map;
public class AssertUtil {
public static boolean notEmpty(Object[] array) {
return (array != null) && (array.length > 0);
}
public static boolean notEmpty(Collection<?> collection) {
return (collection != null) && (!collection.isEmpty());
}
public static boolean notEmpty(Map<?,?> map) {
return (map != null) && (!map.isEmpty());
}
public static void main(String args[]){
}
}
3. 测试
public static void main(String[] args) throws Exception{
defaultCompile("d:/tmp");
compilePackage("d:/tmp/src", "d:/tmp/bin","d:/tmp/lib");
}// main
分享到:
相关推荐
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
而且大多数不是很好用,这样自己辛苦开发出来的程序很容易被人反编译过来而据为己有,一般情况下,大多数的人都是用混编器(java obfuscator)来把开发出来的程序进行打乱以达到没有办法来反编译观看源代码,...
Java,Java反编译工具,小颖JAVA源代码反编译工具_1.3.0.0
XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2。 XJad可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件。 XJad带有多页面文本编辑器,反编译完成后可以直接编辑查看,...
有《Java数据库编程实例》一书中的所有实例源程序代码,编译通过的实例类代码和JBuilder工程文件,以及实例中应用的数据库,并有在实例中涉及的相关Java类文件(数据库驱动程序)。
关于五子棋的一个小游戏,其中有源代码 有编译文件 可以直接运行
这是C语言编译器的源代码,供网友学习C语言编译器使用。源代码对C语言的基本架构做了具体的实现,而且代码非常精简,只保留了最基本的部分。
XJad(Java源代码反编译工具) V2.2 XJad是基于Jad核心的Java源程序反编译软件,内置Jad1.5.8e2。 XJad可处理多个*.class文件,可以处理文件夹内的所有文件,甚至可以处理*.jar文件。 XJad带有多页面文本编辑器...
很好玩的一个小游戏,编译完全通过,在java环境中运行,比较适合初学者,但也要一定基础才能看懂
java 计算器小程序代码,可以直接编译运行的
java版飞鸽源代码,包括编译号的程序!
DJ可以从已经编译的二进制class文件重新创建最初的源代码(比如说Java applets)。 DJ可以反编译复杂的Java applets和二进制文件,产生准确的源代码。 DJ是一个标准的Windows应用程序;它甚至不需要你的机器上安装...
本书是www.bocaitong3.com一本专为已经具备Java程序语言基础的读者...帮助读者彻底了解Java Applet的设计方法,并结合源代码展示、解释,轻松地掌握Java Applet程序在网络上的运用,能让你拥有更丰富的设计经验与技巧。
该文档中有《Java数据库编程实例》一书中的所有实例源程序代码,编译通过的实例类代码 和JBuilder工程文件,以及实例中应用的数据库,并有在实例中涉及的相关Java类文件(数据库 驱动程序)。
总之,Java反编译工具是Java开发人员不可或缺的工具之一,在需要查看第三方库或系统源代码、调试应用程序或检测恶意软件时提供帮助。以上介绍的工具是一些常用的Java反编译工具,具体使用需要根据实际情况来选择。
Java编程达人分享:中国象棋游戏源代码,看看界面,是不是相当不错,作者:yaoyun,CSDN达人写的Java象棋游戏,编译环境:JDK1.7 Eclipse3.7 呵呵,可能比较老的环境了。 注:程序中用到了一个字体太大了,删除了...
代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...
(1)反编译QQ Android版本源代码(java),仅供学习、研究使用,不得用于商业用途。 (2)反编译的应用程序清单文件(AndroidManifest.xml.txt)。
基于微信小程序购物商城app设计带Java后端+源代码+文档说明+数据库.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用...
JAVA EE源代码 是反编译过的,有兴趣的可以看看