我正在进行的项目在类路径中存在类冲突和开发人员重用类名的可怕问题。例如,在这个该死的东西中,我们有 16 个,是的,有 16 个称为常量的接口,它会导致各种问题。
我想实现一个检查样式检查,它将搜索各种形式的类重复。这是课程
import java.io.File;
import java.util.List;
import com.puppycrawl.tools.checkstyle.api.AbstractFileSetCheck;
import com.wps.codetools.common.classpath.ClassScanner;
import com.wps.codetools.common.classpath.criteria.ClassNameCriteria;
import com.wps.codetools.common.classpath.locator.ClasspathClassLocator;
/**
* This codestyle check is designed to scan the project for duplicate class names
* This is being done because it is common that if a class name matches a class
* name that is in a library, the two can be confused. Its in my best practice that
* the class names should be unique to the project.
*
*
*/
public class DuplicateClassNames extends AbstractFileSetCheck {
private int fileCount;
@Override
public void beginProcessing(String aCharset) {
super.beginProcessing(aCharset);
// reset the file count
this.fileCount = 0;
}
@Override
public void processFiltered(File file, List<String> aLines) {
this.fileCount++;
System.out.println(file.getPath());
ClassScanner scanner = new ClassScanner();
scanner.addClassCriteria(new ClassNameCriteria(file.getPath()));
scanner.addClassLocater(new ClasspathClassLocator());
List<Class<?>> classes = scanner.findClasses();
if (classes.size() > 0) {
// log the message
log(0, "wps.duplicate.class.name", classes.size(), classes);
// you can call log() multiple times to flag multiple
// errors in the same file
}
}
}
好的,所以 ClassScanner 打开当前 JVM 的类路径并使用各种条件搜索它。这个特定的是一个类名。它可以进入源文件夹,最重要的是它可以进入类路径中包含的库,并使用 ASM 搜索 jar 中的 *.class 文件。如果它根据显示的条件对象找到副本,它会返回一个文件数组。这仍然需要在主流之前进行一些按摩,但我在这里的时间预算如此之快和肮脏。
我的问题是了解检查本身的输入参数。我从示例中复制,但看起来 CheckStyles 为我提供了源文件本身的基本 IO 文件对象,以及字符串数组中源文件的内容。
在获得完全限定的类名之前,我是否必须通过另一个处理器运行这个数组?