Проверка экземпляра стиля

#java #checkstyle #maven-checkstyle-plugin

#java #checkstyle #maven-checkstyle-плагин

Вопрос:

Возможно ли определить тип экземпляра с checkstyle помощью? Например, у меня есть блок кода, подобный

 class A {
... 

   private void method test() {
    ....
    throw new MyCustomException("Some message");
  }
}
  

В этом случае я хочу получить реальный экземпляр MyCustomException.
Я знаю, что мы можем использовать TokenTypes.LITERAL_NEW в пользовательском плагине, но в этом случае я могу получить только имя для исключения, но не тип экземпляра (у меня нет адреса для этого типа исключения).

Комментарии:

1. Вам необходимо предоставить более подробную информацию в вашем примере. Меня смущает, что вы можете получить имя, MyCustomException , но это не тот тип экземпляра, который вы ищете. Какое «правильное» значение вы ищете и чем оно отличается? Вы ищете полный путь к классу исключения или что-то еще?

2. @rveach Да, я хочу получить путь к классу для моего исключения / класса, но в текущей реализации это невозможно. I am confused by you can get the name, MyCustomException, but this is not the instance type you are looking for — вы можете получить только имя, а не экземпляр.

3. Вы говорите экземпляр, но на самом деле вы имеете в виду путь к классу. Экземпляр — это создание объекта в памяти. Вы не эмулируете Java, поэтому вы не выделяете этот объект.

4. если я знаю путь к классу, я могу получить экземпляр, это очевидно.

5. Если вы думаете, что можете создать экземпляр класса в памяти внутри Checkstyle, то вы должны знать, что это напрямую не поддерживается и требует, чтобы ваш код и Checkstyle находились на одном пути к классу и совместно использовали загрузчики классов. В зависимости от того, как вы вызываете Checkstyle, вы можете не получить тот же загрузчик классов и не сможете создать экземпляр даже со всей этой информацией. Я считаю, что maven-checkstyle-plugin является одним из примеров, когда это не сработает.

Ответ №1:

Поскольку вам нужен путь к классу исключения, вы должны эмулировать то, как Java определяет путь к классу из исходного кода.

Для этого необходимо изучить импорт и пакет. Вы не сможете полностью определить это с помощью Checkstyle, поскольку он просматривает только один файл, а Java фактически просматривает несколько папок, но вы можете подобраться довольно близко.

Сначала найдите импорт с этим точным именем класса. Если импорт отсутствует, то выбор заключается в том, что он поступает из java.lang пакета или текущего пакета проверяемого файла. Вы должны создать список для любых java.lang исключений (если таковые имеются), которые вы хотите автоматически идентифицировать. Все остальное в этом списке по умолчанию будет соответствовать объявлению пакета файла.

В Checkstyle есть несколько проверок, которые реализуют эту логику, если вы хотите увидеть примеры.

Комментарии:

1. Извините, но я не вижу никакого смысла в этой логике. Например, если вы создаете исключение и хотите обработать его с помощью Checkstyle, вам следует добавить этот файл в некоторый список. Я думаю, при таком подходе мы получим более сложную логику, чем прибыль. Но в любом случае, спасибо за ответ.

2. Не все пользовательские исключения будут находиться в исходном коде, которым вы управляете. Throwable и Exception определены в JRE, и Checkstyle не будет иметь к ним доступа. То же самое относится и к сторонним банкам и т. Д. Если вы хотите знать, откуда берется класс, вы должны следить за импортом. Вы можете выполнять более сложные проверки для хранения информации о других файлах в памяти, но Checkstyle пока не поддерживает ее напрямую.