悠然乱弹:从几个方法的重构讲开去--文件相关的处理

简介:

简单看看吧,确实没有什么好的解决方案,那我们就抽丝剥茧,看看这三个方法里都涉及到哪些个领域?

  1. 涉及到注解方面的处理
  2. 涉及到多种注解方面的处理
  3. 涉及到文件查找方面的问题
  4. 涉及到多种资源文件查找方面的问题-file,jar
  5. 涉及到对查找到资源文件之后的后续处理的问题

好吧,可能还有别的问题,我们先利用上面分析出来的问题,看看有没有着手之处??

仔细分析下来,暂时有三种要遍历的文件了,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){
...
}
而不用再写烦人的if(protocal.equals("file"),  if(protocal.equals("jar")等等了,关键是后面不管再来多少种类型,咱的处理逻辑也不用再进行调整了。

接下来呢,肯定要进行文件的查找与处理,咋办呢??抄,在JDK中有个FileFilter,咱给他来个FileObjectFileter不就解了??

?
1
2
3
public interface FileObjectFilter {
     public boolean accept(FileObject fileObject);
}
那后续还要处理呢?再来个FileObjectProcessor

?
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> }
那咱要找个所有的class文件,怎么找呢??先写个文件扩展名过滤器

?
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);
         //做处理处理的一些事情
     }
});
...
在文件处理方面比原来的形式好多了,但是上面提到的性能问题还是存在的。

胖子不是一口吃成的,罗马不是一天到达的,这篇先到这儿,下篇再看注解相关的处理。

相关文章
|
4月前
|
Web App开发 自然语言处理
一盏茶的功夫带你掌握烦人的 this 指向问题( 一 )
一盏茶的功夫带你掌握烦人的 this 指向问题( 一 )
|
4月前
|
Web App开发 自然语言处理
一盏茶的功夫带你掌握烦人的 this 指向问题( 二 )
一盏茶的功夫带你掌握烦人的 this 指向问题( 二 )
|
Go
腥风血雨中,这招救了我的代码!
腥风血雨中,这招救了我的代码!
64 0
|
7月前
|
缓存 前端开发 Java
去掉 if...else 的七种绝佳之法...
去掉 if...else 的七种绝佳之法...
|
设计模式 SQL Java
有点狠有点猛,我用责任链模式重构了业务代码
文章开篇,抛出一个老生常谈的问题,学习设计模式有什么作用? 设计模式主要是为了应对代码的复杂性,让其满足开闭原则,提高代码的扩展性 另外,学习的设计模式 一定要在业务代码中落实,只有理论没有真正实施,是无法真正掌握并且灵活运用设计模式的 这篇文章主要说 责任链设计模式,认识此模式是在读 Mybatis 源码时, Interceptor 拦截器主要使用的就是责任链,当时读过后就留下了很深的印象(内心 OS:还能这样玩)
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
105 1
|
Python
一日一技:你的代码是如何被炫技毁掉的
一日一技:你的代码是如何被炫技毁掉的
113 0
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第一百一十五题-根据包名 在指定空间中创建对象
#yyds干货盘点# 前端歌谣的刷题之路-第一百一十五题-根据包名 在指定空间中创建对象
53 0
#yyds干货盘点# 前端歌谣的刷题之路-第一百一十五题-根据包名 在指定空间中创建对象
|
存储 算法 安全
烧点脑子使劲看--对象详细讲解
当Java虚拟机遇到一条new字节码指令时,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否已经被加载,如果没有,就必须先将就该类加载到内存中,具体过程见:
100 0