以前有段时间需要知道某些类在什么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
|求贤若渴