日期:2014-05-16  浏览次数:20352 次

.java编写库关键字搜索----针对js等库
今天开始分析 DWZ框架的源代码,发现单单从txt来看实在是不好分析,各种函数都不是到是哪里定义的...
因为javascript的函数定义方法不像java C++等语言有固定的语法,可以模糊匹配 ..
对于js这样的 函数只能通过关键字搜索代码如下 直接 javac  java就可以运行 
   import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * js文件关键字批量搜索.. 
 * 初衷是搜索js..可以针对于所有类型可读文件
 * 可以从一个path下的js文件中定位指定关键字.....
 * 在分析大规模的js库的时候可以方便定位关键字所在位置..
 * @author 岳东卫
 */
public class JFunctionFinder {  
 
 public JFunctionFinder() {
  
  }
 /**
  * 存放搜索结果集合
  */
 private Collection<String> col=new ArrayList<String>() ;
 
   /**返回库目录下所有js文件
    * @param path  js文件所在的路径
    * @return 一个目录下的所有文件内容
    * @throws Exception
    */
   private   static  File[] getFile(String  path) throws Exception{
    File f =null;
    try{
    f=new  File(path) ;
    }catch (Exception e) {
  throw new Exception("路径不存在",e) ;
 } 
 return f.listFiles() ;  //js文件集合
   }
  
   /**
    * 递归遍历
    * @param  files  getFile结果   一个File数组
    * @param  functionName   要搜索的关键字名字..严格区分大小写
    * @return 返回一个function所在位置的集合... 
    * @throws IOException
    */
   private void getFunctionLocation(File[]files,String functionName) throws IOException {
    for(File f:files){ 
    
   //如果是文件夹 那么递归
     if(f.isDirectory()){  
          try {
       File []tem=getFile(f.getPath()) ;
       this.getFunctionLocation(tem, functionName) ;
          } catch (Exception e) {
        e.printStackTrace();
         }
     }
    
     //如果是普通js文件
     else{
      InputStream is=new FileInputStream(f) ;
      byte []bt=new byte[is.available()]; 
      is.read(bt) ;
      String contents=new String(bt) ;//默认unicode编码..   
      Pattern p=Pattern.compile(functionName,Pattern.MULTILINE) ;  
      Matcher m=p.matcher(contents) ;
      if(m.find()){
       col.add("["+new String(f.getName())+"]\n") ;
      }
     
       }   
    }
   }
   
   /**
    * 返回搜索结果
    * @return
    */
   pu