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
分享到:
相关推荐
Java反编译是Java开发中一个重要的技术领域,它涉及到对已编译的Java字节码(.class文件)进行逆向工程,以获取接近原始的源代码。这对于理解库函数、研究开源软件或者调试不可获得源代码的二进制程序非常有用。本文...
在软件开发过程中,有时候我们可能需要查看已编译的Java类文件的源代码,例如在分析开源项目、调试未知问题或学习他人的编程技巧时。这种情况下,反编译工具就显得非常有用。 Java反编译通常涉及到以下几个关键知识...
Java源代码反编译是一个对已编译的Java字节码(.class文件)进行逆向工程处理,以恢复接近原始的Java源代码的过程。这个过程通常由开发者在没有源代码但有二进制类文件的情况下进行,以便理解或修改现有程序的行为。在...
8. **锋网源码.url**:这是一个书签文件,可能指向一个与Java源代码反编译或编程相关的网站,用户可以通过这个链接获取更多的学习资源或社区支持。 总的来说,JAVA源代码反编译超级引挚 v1是Java开发中的一个重要...
添加动态执行的编译环境 options 是个集合,添加内容,字符集,classpath等 * 6.传入JavaFileObject的java文件,是个集合,创建JavaSourceObject实现这个接口,Kind.SOURCE.extension = '.java' * 7.创建任务并...
该工具的主要功能是将已经编译过的Java字节码(.class文件)转换回可读的Java源代码(.java文件),帮助开发者理解和分析已有的Java程序,尤其是在没有源代码的情况下。 Java反编译是一个复杂的过程,涉及到对Java...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失或不可用,反编译工具就能派上用场。这些工具可以帮助开发者理解代码的功能,修复错误,...
在Java编程中,源代码会被编译成字节码(.class文件),这种字节码是平台无关的,可以在任何安装了Java虚拟机(JVM)的系统上运行。然而,字节码本身并不包含源代码级别的详细信息,如变量名、方法名或注释,这使得...
Java源代码反编译是将已编译的Java字节码(.class文件)转换回可读的Java源代码(.java文件)的过程。这个过程对于理解已加密或混淆的代码、学习第三方库的工作原理或者在没有源代码的情况下进行调试非常有用。"小颖Java...
"小颖JAVA源代码反编译引挚 1.4 标准版"是一款针对这个需求设计的工具,主要用于帮助开发者理解和学习Java程序的内部工作原理,或者在没有源代码的情况下进行逆向工程。 首先,我们来了解一下什么是Java反编译。...
在Java编程环境中,源代码通常被编译成字节码,这是Java虚拟机(JVM)可以执行的语言。然而,在某些情况下,我们可能只有字节码而没有源代码,这时就需要用到反编译工具。 描述中提到的"类名索引、方法名索引、字段...
Java源代码反编译是将已编译的Java字节码(.class文件)转换回可读的源代码格式(.java文件)的过程。这个过程对于理解已加密或混淆的代码、学习第三方库的工作原理或者进行逆向工程是至关重要的。"Java源代码反编译专家...
【小颖Java源代码反编译超级引挚V1.4版】是一款专门针对Java源代码的反编译工具,其主要功能是将已编译的Java字节码(.class文件)转换回人类可读的Java源代码(.java文件)。在软件开发过程中,有时我们可能需要...
Java程序在执行时,会先由Java编译器将源代码编译成字节码,这些字节码存储在.class文件中。Java虚拟机(JVM)再将字节码解释执行。而反编译就是逆向这个过程,通过特定的工具将字节码还原成接近原始的Java源代码。...
总之,【小颖JAVA源代码反编译超级引挚 V1.4 标准版】是一款强大的开发辅助工具,它结合了多种技术,帮助开发者在没有源代码的情况下理解和修改Java程序,是进行软件分析、学习和调试的重要助手。
- **JAD**:全称为Java Decompiler,提供命令行界面,可以将字节码反编译为Java源代码,也是XJad文件名的来源。 - **Procyon**:它不仅是一个反编译器,还包含一个编译器和一个语法分析器,能够产生高质量的反编译...
总的来说,Java源代码反编译是一个强大的工具,有助于开发者在没有源代码的情况下理解或调试Java程序。然而,它也带来了一些法律和道德的考虑,因此在使用时必须谨慎。对于初学者,了解反编译的基本概念和工具,以及...