.java编写库关键字搜索----针对js等库

简介: 今天开始分析 DWZ框架的源代码,发现单单从txt来看实在是不好分析,各种函数都不是到是哪里定义的... 因为javascript的函数定义方法不像java C++等语言有固定的语法,可以模糊匹配 .
今天开始分析 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
    */
   public Collection<String> getResult(){
    return this.col ;
   }
  
   /**
    * 只需要调用这个函数开始搜索就行.,
    * @param path   搜索路径如  D:\lib
    * @param functionName 函数名字 严格区分大小
    * @return 返回搜索结果的集合 ...
    */
   public Collection<String>  beginSearch(String  path,String functionName){  
    this.col.add("存在"+functionName+"的库文件是:") ;
    try {
  File []f=getFile(path) ; 
  this.getFunctionLocation(f, functionName) ; 
 } catch (Exception e) {
  e.printStackTrace();
 }
 return col; 
   }
   public static void main(String[] args) throws IOException, Exception {
  
   JFunctionFinder f=new JFunctionFinder() ;  //创建一个对象 
   System.out.println("请输入库文件的路径:");
   String path=(new Scanner(System.in)).next() ;  //输入路径 如: d:\lib
   System.out.println("输入关键字:");
   String key=(new Scanner(System.in)).next() ;  //输入路径 如: d:\lib
   Collection<String> c=f.beginSearch(path, key) ;//返回存在关键字的集合
   for(String s:c){
    System.out.print(s);
   }
  }
 }
目录
相关文章
|
21天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
4天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
21天前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2137 3
|
2月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
59 9
|
2月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
57 8
|
2月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
81 6
|
2月前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
36 5
|
2月前
|
前端开发 JavaScript 开发者
除了 async/await 关键字,还有哪些方式可以在 JavaScript 中实现异步编程?
【10月更文挑战第30天】这些异步编程方式在不同的场景和需求下各有优劣,开发者可以根据具体的项目情况选择合适的方式来实现异步编程,以达到高效、可读和易于维护的代码效果。
|
2月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
52 4
|
2月前
|
Java API Apache