一个查找jar包中类的小工具 -凯发k8网页登录

关注后端架构、中间件、分布式和并发编程

   :: 凯发k8网页登录首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 trackbacks
以前有段时间需要知道某些类在什么jar包中,这样当出现classnotfoundexception或者noclassdeffounderror的时候我们就可以去找这个类在什么jar包中然后去引用此jar包即可。在我们的系统很小的时候我恨不能都将jar包放入eclipse中,这样借助eclipse平台查找类就非常方便了。包括非常有用的ctrl shift t,ctrl t,reference search等等,但是当工程多了大了的时候,上百个jar包放入eclipse中那个速度完全不是我能忍受的,稍微动一下就看到cpu一直在那抖动。好吧,用maven,更慢,简直受不了,所以大多数时候maven是一个比较好的批处理工具,和ui结合起来还不是很好用。

我发现我非常需要这个从jar包中寻找类的功能,我只需要看看我的类在什么地方而已,仅次而已!于是自己就写了一个类查找器。非常简单就是遍历所有的jar包中的类,当匹配类名称的时候就显示类所在的jar包。
有以下几个特性:
  • 允许添加jar包,zip包
  • 允许匹配包名称
  • 允许匹配类名称
  • 允许区分大小写
  • 支持模糊查找(包括*和?)
  • 自动匹配(输入完成后就匹配)
  • 关闭后保存所有jar包结果(下次启动无需再次扫描)
  • 完全内存查找,速度飞快
看下面的几张截图。








这个是4个多月前临时的东西,花了一个下午,用了几天解决了问题后就基本不用了,所以一直没有维护,于是就放出来了。有需要的同学就可以看看。由于当初只是临时用用,所以就写得非常乱,凑合着用了。

分析几段源码吧。完整的源码在附件中。

这里还有一个我使用过的exe程序(windows 版)。

下面是一段字符串匹配的代码(这段代码应该是前几年我从中摘取出来的,后来移到我的工具包中了,我觉得这对逻辑太复杂,所以一直没怎么研究,但是确实效率不错,而且没有发现使用错误。)
  1     public static boolean match(string pattern, string str, boolean iscasesensitive) {
  2         char[] patarr = pattern.tochararray();
  3         char[] strarr = str.tochararray();
  4         int patidxstart = 0;
  5         int patidxend = patarr.length - 1;
  6         int stridxstart = 0;
  7         int stridxend = strarr.length - 1;
  8         char ch;
  9 
 10         boolean containsstar = false;
 11         for (int i = 0; i < patarr.length; i) {
 12             if (patarr[i] == '*') {
 13                 containsstar = true;
 14                 break;
 15             }
 16         }
 17 
 18         if (!containsstar) {
 19             // no '*'s, so we make a shortcut
 20             if (patidxend != stridxend) {
 21                 return false// pattern and string do not have the same size
 22             }
 23             for (int i = 0; i <= patidxend; i) {
 24                 ch = patarr[i];
 25                 if (ch != '?') {
 26                     if (iscasesensitive && ch != strarr[i]) {
 27                         return false// character mismatch
 28                     }
 29                     if (!iscasesensitive
 30                             && character.touppercase(ch) != character.touppercase(strarr[i])) {
 31                         return false// character mismatch
 32                     }
 33                 }
 34             }
 35             return true// string matches against pattern
 36         }
 37 
 38         if (patidxend == 0) {
 39             return true// pattern contains only '*', which matches anything
 40         }
 41 
 42         // process characters before first star
 43         while ((ch = patarr[patidxstart]) != '*' && stridxstart <= stridxend) {
 44             if (ch != '?') {
 45                 if (iscasesensitive && ch != strarr[stridxstart]) {
 46                     return false// character mismatch
 47                 }
 48                 if (!iscasesensitive
 49                         && character.touppercase(ch) != character.touppercase(strarr[stridxstart])) {
 50                     return false// character mismatch
 51                 }
 52             }
 53             patidxstart;
 54             stridxstart;
 55         }
 56         if (stridxstart > stridxend) {
 57             // all characters in the string are used. check if only '*'s are
 58             // left in the pattern. if so, we succeeded. otherwise failure.
 59             for (int i = patidxstart; i <= patidxend; i) {
 60                 if (patarr[i] != '*') {
 61                     return false;
 62                 }
 63             }
 64             return true;
 65         }
 66 
 67         // process characters after last star
 68         while ((ch = patarr[patidxend]) != '*' && stridxstart <= stridxend) {
 69             if (ch != '?') {
 70                 if (iscasesensitive && ch != strarr[stridxend]) {
 71                     return false// character mismatch
 72                 }
 73                 if (!iscasesensitive
 74                         && character.touppercase(ch) != character.touppercase(strarr[stridxend])) {
 75                     return false// character mismatch
 76                 }
 77             }
 78             patidxend--;
 79             stridxend--;
 80         }
 81         if (stridxstart > stridxend) {
 82             // all characters in the string are used. check if only '*'s are
 83             // left in the pattern. if so, we succeeded. otherwise failure.
 84             for (int i = patidxstart; i <= patidxend; i) {
 85                 if (patarr[i] != '*') {
 86                     return false;
 87                 }
 88             }
 89             return true;
 90         }
 91 
 92         // process pattern between stars. padidxstart and patidxend point
 93         // always to a '*'.
 94         while (patidxstart != patidxend && stridxstart <= stridxend) {
 95             int patidxtmp = -1;
 96             for (int i = patidxstart  1; i <= patidxend; i) {
 97                 if (patarr[i] == '*') {
 98                     patidxtmp = i;
 99                     break;
100                 }
101             }
102             if (patidxtmp == patidxstart  1) {
103                 // two stars next to each other, skip the first one.
104                 patidxstart;
105                 continue;
106             }
107             // find the pattern between padidxstart & padidxtmp in str between
108             // stridxstart & stridxend
109             int patlength = (patidxtmp - patidxstart - 1);
110             int strlength = (stridxend - stridxstart  1);
111             int foundidx = -1;
112             strloop: for (int i = 0; i <= strlength - patlength; i) {
113                 for (int j = 0; j < patlength; j) {
114                     ch = patarr[patidxstart  j  1];
115                     if (ch != '?') {
116                         if (iscasesensitive && ch != strarr[stridxstart  i  j]) {
117                             continue strloop;
118                         }
119                         if (!iscasesensitive
120                                 && character.touppercase(ch) != character
121                                         .touppercase(strarr[stridxstart  i  j])) {
122                             continue strloop;
123                         }
124                     }
125                 }
126 
127                 foundidx = stridxstart  i;
128                 break;
129             }
130 
131             if (foundidx == -1) {
132                 return false;
133             }
134 
135             patidxstart = patidxtmp;
136             stridxstart = foundidx  patlength;
137         }
138 
139         // all characters in the string are used. check if only '*'s are left
140         // in the pattern. if so, we succeeded. otherwise failure.
141         for (int i = patidxstart; i <= patidxend; i) {
142             if (patarr[i] != '*') {
143                 return false;
144             }
145         }
146         return true;
147     }
148 
149     static void print(file jarfile) throws exception {
150         jarfile file = new jarfile(jarfile);
151         for (jarentry e : collections.list(file.entries())) {
152             system.out.println(e.getname());
153         }
154     }

java swing中当光标定位文本框时自动选中其内容的代码。
1         cnametext.addfocuslistener(new focusadapter() {
2             @override
3             public void focusgained(focusevent e) {
4              if(cnametext.gettext().length()>0) {
5                  cnametext.setselectionstart(0);
6                  cnametext.setselectionend(cnametext.gettext().length());
7              }
8             }
9         });

当文本框中有输入变化时触发更新列表动作。早期的做法是将dotext放入线程中这样防止gui卡死,但是在这个例子中由于太快了,所以就没有新起线程。
 1         cnametext.getdocument().adddocumentlistener(new documentlistener() {
 2 
 3             @override
 4             public void changedupdate(documentevent e) {
 5                 dotext(cnametext.gettext());
 6             }
 7 
 8             @override
 9             public void insertupdate(documentevent e) {
10                 dotext(cnametext.gettext());
11             }
12 
13             @override
14             public void removeupdate(documentevent e) {
15                 dotext(cnametext.gettext());
16             }
17         });

遍历一个jar包中所有类的过程。
 1 list<jarentry> list = collections.list(new jarfile(jarfile).entries());
 2                 list<string> fullnames = new arraylist<string>();
 3                 for (jarentry e : list) {
 4                     string n = e.getname();
 5                     if (n.endswith(".class")) {
 6                         n=n.substring(0,n.length()-6);
 7                         fullnames.add(n.replace('/''.'));
 8                     }
 9                 }
10                 classcount = fullnames.size();
11                 classnames = fullnames.toarray(new string[classcount]);


大概这么多吧,写得很乱,看的也很累!!!



©2009-2014 imxylz
|求贤若渴
posted on 2009-12-31 17:07 imxylz 阅读(20702) 评论(11)     所属分类: j2ee
# re: 一个查找jar包中类的小工具 2009-12-31 21:28
阿经济的技术监督  回复  
  

# re: 一个查找jar包中类的小工具 2009-12-31 21:34
文章不错!支持~  回复  
  

# re: 一个查找jar包中类的小工具[未登录] 2010-01-01 03:23
没必要重新造轮子。。。告诉你两个网站:

英文的: www.findjar.com
中文的: www.jar114.com

都比你做得好得多。。。功能更全
  回复  
  

# re: 一个查找jar包中类的小工具 2010-01-01 10:53 xylz
@小毅
如果能上网的话直接去google好了,基本上都能找到!  回复  
  

# re: 一个查找jar包中类的小工具 2010-01-02 15:26
呵呵,我也在写一个类似的东西。
不过,需求有点不一样,是要查出所有jar中重复的jar包和jar包中的重复类。
当然jboss tattletale已经基本满足要求,只是报表不太适合领导的要求。  回复  
  

# re: 一个查找jar包中类的小工具 2010-07-14 09:04
我一般就是用eclipse的 ctrl shift t的方式来找  回复  
  

# re: 一个查找jar包中类的小工具 2010-07-14 14:25 xylz
@zhong
如果你有几百个jar包的时候你就不容易查找某个类了。将所有jar包加入一个空白的eclipse工程?这也会非常慢,而且eclipse也会有缓存的概念,这会导致那些使用maven一天发布n个snapshot包的非常痛苦。  回复  
  

# re: 一个查找jar包中类的小工具 2012-01-10 21:42
@小毅
傻逼 别人做的是找自己jar包里面的类
你是根据类找别人服务器的jar包.....
如果这个jar包是你自己写的. 114服务器没有这个jar. 你找个吊毛啊  回复  
  

# re: 一个查找jar包中类的小工具[未登录] 2014-02-27 07:29
www.findmaven.net,根据class名和jar名查找jar和maven gav,还提供maven依赖树,jar结构等  回复  
  

# re: 一个查找jar包中类的小工具 2014-02-27 20:45 imxylz
@程序员
网站不错。我当年是为了搜索本地,我们自己的类而使用的。我们最开始一直用ant,没有使用maven,主要是我们内网无法上外网。  回复  
  

# re: 一个查找jar包中类的小工具[未登录] 2015-03-12 14:04
这东西做得不错,确实是用来找自定义的jar(第三方公司,不是开源项目)包中class的利器。感谢楼主  回复  
  


©2009-2014
网站地图