Как программно включить assert?
Как я могу программным образом включить assert для определенных классов вместо указания командной строки param -ea??
public class TestAssert {
private static final int foo[] = new int[]{4,5,67};
public static void main(String []args) {
assert foo.length == 10;
}
}
Ответы
Ответ 1
Это был комментарий к хорошему ответу @bala, но он слишком долгое время.
Если вы просто включаете утверждения, а затем вызываете свой основной класс - ваш основной класс будет загружен до того, как будут включены утверждения, поэтому вам, вероятно, понадобится загрузчик, который не ссылается ни на что другое в вашем коде напрямую. Он может устанавливать утверждения, а затем загружать остальную часть кода через отражение.
Если утверждения не включены, когда класс загружен, они должны быть немедленно "Скомпилированы", поэтому вы не сможете включать и выключать их. Если вы хотите переключить их, вы вообще не хотите утверждений.
Из-за компиляции во время выполнения, примерно так:
public myAssertNotNull(Object o) {
if(checkArguments)
if(o == null)
throw new IllegalArgumentException("Assertion Failed");
}
Должна работать так же быстро, как и утверждения, потому что если код выполняется много, а checkArguments - false и не изменяется, то весь вызов метода может быть скомпилирован во время выполнения, который будет иметь тот же базовый эффект, что и утверждение (This производительность зависит от ВМ).
Ответ 2
Try
ClassLoader loader = getClass().getClassLoader();
setDefaultAssertionStatus(true);
или
ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
EDIT:
на основе комментариев
ClassLoader loader = ClassLoader.getSystemClassLoader();
loader.setDefaultAssertionStatus(true);
Class<?> c = loader.loadClass("MyClass");
MyClass myObj = (MyClass) c.newInstance();
public class MyClass {
private static final int foo[] = new int[]{4,5,67};
MyClass()
{
assert foo.length == 10;
}
}
Ответ 3
Самый простой и лучший способ:
public static void assertion(boolean condition,String conditionFailureMessage)
{
if(!b)
throw new AssertionError(conditionFailureMessage);
}
Нет необходимости устанавливать -e как аргумент VM.
вызовите функцию like:
assertion(sum>=n,"sum cannot be less than n");
Если утверждение не выполнено, код выдаст AssertionError, иначе код будет безопасно работать.
Ответ 4
Вы также можете включить/отключить утверждения программно:
http://download.oracle.com/docs/cd/E19683-01/806-7930/assert-5/index.html