Как программно включить assert? - PullRequest
29 голосов
/ 06 апреля 2011

Как программно включить assert для определенных классов вместо указания параметра командной строки "-ea"?

public class TestAssert {

    private static final int foo[] = new int[]{4,5,67};


    public static void main(String []args) {
        assert foo.length == 10;
    }
}

Ответы [ 4 ]

13 голосов
/ 06 апреля 2011

Попробуйте

ClassLoader loader = getClass().getClassLoader();
setDefaultAssertionStatus(true);

или

ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);

РЕДАКТИРОВАТЬ:

на основе комментариев

    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;
    }
}
9 голосов
/ 06 апреля 2011

Это был комментарий к хорошему ответу @ bala, но он был слишком длинным.

Если вы просто активируете утверждения, тогда вызовите свой основной класс - ваш главный класс будет загружен до того, как утверждения будут включены, поэтому вы сможетевероятно, нужен загрузчик, который не ссылается ни на что другое в вашем коде напрямую.Он может установить утверждения и затем загрузить остальную часть кода с помощью отражения.

Если утверждения не включены при загрузке класса, они должны быть немедленно "скомпилированы", чтобы вы не могли включать и выключать их.Если вы хотите их переключать, тогда вам вообще не нужны утверждения.

Из-за компиляции во время выполнения, что-то вроде этого:

public myAssertNotNull(Object o) {
    if(checkArguments) 
        if(o == null)
            throw new IllegalArgumentException("Assertion Failed");
}

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

1 голос
/ 11 февраля 2015

Самый простой и лучший способ может быть:

public static void assertion(boolean condition, String conditionFailureMessage)
{
    if(!condition)
        throw new AssertionError(conditionFailureMessage);
}

Нет необходимости устанавливать -ea в качестве аргумента VM.

вызывать функцию как:

assertion(sum>=n,"sum cannot be less than n");

Если утверждение не выполнено, код выдаст AssertionError, иначе код будет выполняться безопасно.

1 голос
/ 28 апреля 2011

Вы также можете включать / отключать утверждения программно:
http://download.oracle.com/docs/cd/E19683-01/806-7930/assert-5/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...