Как поставить значение для аннотации из константы Java

Для тех, у кого есть проблемы с MVC3 с JSON, который автоматически десериализуется для связующего и является слишком большим, вот решение.

  1. Скопируйте код класса JsonValueProviderFactory из исходный код MVC3 в новый класс.
  2. Добавьте строку, чтобы изменить максимальную длину JSON до того, как объект будет десериализован.
  3. Замените класс JsonValueProviderFactory новым модифицированным классом.

Благодаря http://blog.naver.com/techshare/100145191355 и https://gist.github.com/DalSoft/1588818 для указания мне в правильном направлении, как это сделать. Последняя ссылка на первом сайте содержит полный исходный код для решения.

131
задан Alex Shesterov 8 October 2016 в 21:03
поделиться

4 ответа

Компилированные константы могут быть только примитивы и строки :

15,28. Постоянные выражения

Время компиляции постоянное выражение - это выражение, обозначающее значение примитивного типа или строки, которая не выполняется резко и состоит в том, чтобы использовать только следующие:

  • литералы примитивного типа и Литералы типа string
  • отливы от примитивных типов и отливок к строке
  • [...] Операторы [...]
  • Сингезированные выражения, содержащиеся в скользящем языках которых является постоянным выражением.
  • Простые имена, которые относятся к постоянным переменным.
  • Квалифицированные имена формы TypEname . Идентификатор , которые относятся к постоянным переменным.

На самом деле в Java нет способа защищать предметы в массиве. Во время выполнения кто-то всегда может сделать FieldValues.field1 [0] = «Value3» , поэтому массив не может быть постоянным, если мы выглядим глубже.

121
ответ дан 23 November 2019 в 23:57
поделиться

Вы можете использовать константу (то есть статическая, окончательная переменная) в качестве параметра для аннотации. В качестве быстрого примера я использую что-то вроде этого справедливо:

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTestClass
{
    private static final int TEST_TIMEOUT = 60000; // one minute per test

    @Test(timeout=TEST_TIMEOUT)
    public void testJDK()
    {
        assertTrue("Something is very wrong", Boolean.TRUE);
    }
}

Обратите внимание, что можно пройти Test_Timeout постоянную прямо в аннотацию.

ОтHAPHand я не вспоминаю, что когда-либо пробовал это с массивом, поэтому вы можете бежать в некоторые проблемы с небольшими различиями в том, как массивы представлены как параметры аннотации по сравнению с переменными Java? Но как для другой части вашего вопроса, вы определенно можете использовать постоянную строку без каких-либо проблем.

Редактировать: Я только что попробовал это со строковым массивом, и не столкнулся с этой проблемой - однако компилятор сделал , сказал мне, что «значение атрибута должно быть постоянным», несмотря на Массив определяется как публичная статическая финальная строка [] . Возможно, это не нравится тот факт, что массивы смещаются? Хм ...

34
ответ дан 23 November 2019 в 23:57
поделиться

ли кто-то знает, как я могу использовать Константа строки или строка [] постоянная Чтобы поставить стоимость аннотации?

К сожалению, вы не можете сделать это с массивами. С нерубряными переменными значение должно быть окончательным статическим.

7
ответ дан 23 November 2019 в 23:57
поделиться

Вы не предоставляете его массивом в вашем примере. Следующие компилирует нормально:

   public @interface SampleAnnotation {
        String[] sampleValues();
    }

    public class Values {
        public static final String v1 = "A";
        public static final String v2 = "B";

        @SampleAnnotation(sampleValues = { v1, v2 })
        public void foo() {
        }
    }
10
ответ дан 23 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: