Как программно включить 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, иначе код будет безопасно работать.