2017-02-09 22 views
0

В большой базе кода, может быть неправильно КИ инициализации, как это:Как найти регистраторов с неправильными именами классов в большой Java-кодовой базе?

public class MyClass implements Whatever { 

    private static final Logger logger = Logger.getLogger(WrongClass.class); 

(Должен быть getLogger(MyClass.class) вместо этого). Я ищу быстрый и грязный способ открыть их, не написав целую программу. Ложные срабатывания, если не слишком много (например, с внутренними классами), были приемлемыми.

Я попытался это регулярное выражение поиска из в Eclipse, но это не соответствует на моем примере выше:

(?s)(?<!class \1.*)Logger.getLogger\((\w+)\.class 

Я также думал о какой-то find -exec grep -q \; -print, но я не получил его работать либо.

+0

Вам нужна командная строка 'grep' для идентификации этих файлов? – Inian

+0

Просто что-то простое, что говорит мне, какие файлы подозрительны. Это может быть в поиске Eclipse, командной строке, любые стандартные инструменты для программистов могут рекурсивно проверять дерево файлов и возвращать подозрительные имена файлов. Написание полной java-программы кажется настолько излишним для такой простой вещи. Интересно, возможно ли с помощью регулярного выражения ... – Paramaeleon

ответ

1

У меня был такой же вызов, и я не получил его с помощью find/grep/sed/awk и т. Д. Вовремя. Поэтому я решил написать небольшую программу Java:

public static void main(String[] args) throws IOException { 
    Files.walk(Paths.get("/path/to/sources")).filter(p -> p.toFile().isFile() && p.getFileName().toFile().getName().endsWith(".java")) 
     .forEach(p -> { 
      String filename = p.toFile().getName(); 
      String clazz = filename.split("\\.")[0]; 
      try { 
       FileUtils.readLines(p.toFile()).forEach(line -> { 
        if (line.contains("getLog(") || line.contains("getLogger(")) { 
         if (line.matches(".*\\([ ]*" + clazz + "\\.class[ ]*\\).*")) { 
          System.out.println(String.format(" ok: %s: %s", p, line.trim())); 
         } else { 
          System.out.println(String.format("nok: %s: %s", p, line.trim())); 
         } 
        } 
       }); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
    } 

Очевидно, что это быстро и грязно. ;-)