Проверьте, не компилируется ли java-код

Это может звучать немного странно, но я ищу возможность проверить, отклоняются ли некоторые утверждения в коде средством проверки типов (это означает, что код должен НЕ компилировать).

Объясните мое намерение: я провожу контролируемый эксперимент с системами типов, в котором мои испытуемые должны написать для меня некоторые методы на java. Функциональность методов, написанных субъектами, можно легко протестировать с помощью модульных тестов, но я также хочу, чтобы методы были хорошо типизированы (это означает, что некоторые вызовы методов не должны быть запрещены).

Один из способов, который я мог бы представить для достижения этого, - это написать операторы, которые должны разбить сборку на отдельный файл, добавить его в путь к классам и запустить javac, чтобы увидеть, возникает ли какая-либо ошибка во время сборки. Хотя это может сработать, это не выглядит очень сложным, поэтому мой вопрос: Есть ли лучший способ (автоматически) проверить, отражены ли некоторые операторы средством проверки типов?


person Seb    schedule 12.07.2014    source источник


Ответы (2)


Вы ознакомились с платформой проверки? Его можно использовать для статического анализа кода и многого другого. Это может хорошо подойти для того, что вы делаете. Вот ссылка на мой ответ с примером процессора типа аннотации.

Также вы можете найти API компилятора Java довольно полезно. Это позволяет программно выполнять javac на одной Java-машине. Таким образом, вы можете использовать его как часть своих тестов.

person Alexey Gavrilov    schedule 12.07.2014
comment
Java Compiler API — это именно то, что я искал. Спасибо! :) - person Seb; 15.07.2014

Это разновидность проблемы остановки, которая в общем случае неразрешима. Для этого вам нужно запустить (или в данном случае скомпилировать) код. Поэтому решение, которое вы уже предложили, является лучшим решением.

person CDahn    schedule 12.07.2014
comment
Компиляция кода не проблема. Я могу скомпилировать код в любое время (или даже запустить его). Я ищу, например. какая-то аннотация, которую я могу добавить к тестовому методу, которая заставляет testframework проверять, не сломается ли сборка, и после этого исключать метод из компиляции (потому что в противном случае весь проект больше не будет компилироваться). - person Seb; 12.07.2014
comment
Вы не можете проверить, сломается ли сборка, не собрав ее. Это связано со свойствами, описанными в задаче остановки. Поэтому, если вы все равно должны собрать его, просто проверьте, не произошла ли эта сборка, проанализируйте ответ об ошибке и предпримите соответствующие действия (например, удалите метод из кода тестового комплекта). - person CDahn; 12.07.2014