#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 пока не поддерживает ее напрямую.