简单看看吧,确实没有什么好的解决方案,那我们就抽丝剥茧,看看这三个方法里都涉及到哪些个领域?
- 涉及到注解方面的处理
- 涉及到多种注解方面的处理
- 涉及到文件查找方面的问题
- 涉及到多种资源文件查找方面的问题-file,jar
- 涉及到对查找到资源文件之后的后续处理的问题
好吧,可能还有别的问题,我们先利用上面分析出来的问题,看看有没有着手之处??
仔细分析下来,暂时有三种要遍历的文件了,file,jar,自定义ClassLoader,那我们简单抽象一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
interface
FileObject{
String getFileName(); <span></span>
String getFileExtName();
List<FileObject> getSubFileObject();
void
foreach( FileObjectFilter fileObjectFilter,FileObjectProcessor fileObjectProcessor);
...
}
然后构建
三个实现类:
public
class
FileObjectImpl
implements
FileObject{
...
}
public
class
JarFileObjectImpl
implements
FileObject{
...
}
public
class
ClassLoaderFileObjectImpl
implements
FileObject{
...
}
|
这样一来就把不同的文件类型分解了。
在后续的处理中,就只要写:
1
2
3
|
for
(FileObject fileObject:fileObjects){
...
}
|
接下来呢,肯定要进行文件的查找与处理,咋办呢??抄,在JDK中有个FileFilter,咱给他来个FileObjectFileter不就解了??
1
2
3
|
public
interface
FileObjectFilter {
public
boolean
accept(FileObject fileObject);
}
|
1
2
3
|
public
interface
FileObjectProcessor {
void
process(FileObject fileObject);
}
|
1
2
3
4
5
6
7
8
|
public
void
foreach(FileObjectFilter fileObjectFilter,
FileObjectProcessor fileObjectProcessor) {
if
(fileObjectFilter.accept(
this
)) {
fileObjectProcessor.process(
this
);
}
for
(FileObject subFileObject : getChildren()) {
foreach(subFileObject, fileObjectFilter, fileObjectProcessor, parentFirst);
} <span></span> }
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
FileExtNameFileObjectFilter
implements
FileObjectFilter {
String fileExtName;
public
FileExtNameFileObjectFilter(String fileExtName) {
this
.fileExtName = fileExtName;
}
public
boolean
accept(FileObject fileObject) {
String extName = fileObject.getExtName();
if
(extName !=
null
) {
return
extName.equals(fileExtName);
}
return
false
;
}
}
|
1
2
3
4
5
|
fileObject.foreach(
new
FileExtNameFileObjectFilter(
"class"
),
new
FileObjectProcessor() {
public
void
process(FileObject fileObject) {
System.out.println(fileObject.getPath());
}
});
|
OK,到此为止,各种文件的支持与遍历,过滤处理已经有比较好的解决方案了。
代码写起来很容易,扩展起来也很方便。可以满意了。
那么上面的代码可以处理为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
fileObject.foreach(
new
AnnotationFileObjectFilter(Abc.
class
),
new
FileObjectProcessor() {
public
void
process(FileObject fileObject) {
Class clazz=Class.forName(fileObject.getFileName);
//做处理处理的一些事情
}
});
fileObject.foreach(
new
AnnotationFileObjectFilter(Def.
class
),
new
FileObjectProcessor() {
public
void
process(FileObject fileObject) {
Class clazz=Class.forName(fileObject.getFileName);
//做处理处理的一些事情
}
});
...
|
胖子不是一口吃成的,罗马不是一天到达的,这篇先到这儿,下篇再看注解相关的处理。