Аннотация не будет использоваться, как сделать Java эмоциональной для вас

Java
Аннотация не будет использоваться, как сделать Java эмоциональной для вас

Привет всем, я Сяо Цай, Сяо Цай, который хочет быть Цай Буцаем в интернет-индустрии. Она может быть мягкой или жесткой, как она мягкая, а белая проституция жесткая!Черт~ Не забудьте поставить мне тройку после прочтения!

Эта статья в основном знакомитJava 中注解的使用

При необходимости вы можете обратиться к

Если это поможет, не забудьтекак

Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!

Я полагаю, что все открыли для себя недавнюю серию статей, каждая из которых является относительно базовым знанием Java. Но я не знаю, думаете ли вы, что это какие-то очень базовые знания после прочтения. Только когда фундамент прочный, развитие может быть более эффективным.Не гонитесь за успехом, можно вернуться назад и быть прагматиком, и вы ничего не добьетесь. Так что эта проблема все та же, Сяокай и друзья приходят учиться вместе注解использование.

первое знакомство

аннотацияТакже известен как метаданные. Предоставляет нам формальный способ добавления информации в наш код, что позволяет нам очень удобно использовать эти данные в более поздний момент времени.

Аннотации были введены после Java 1.5 и могут предоставлять информацию, необходимую для полного описания программы, в формате, который может быть протестирован и проверен компилятором, сохраняя дополнительную информацию о программе.

Использование аннотаций очень простое, просто нужно и@Словосочетание символов. Некоторые новички в Java частоаннотацияиПримечанияПутаница, но роли этих двух схожи, обе используются для описания информации, разница в том,аннотацияОписанная информация предназначена для просмотра приложением, в то время какПримечанияОписанная информация предназначена для просмотра разработчиками.

начинающая парааннотацияможет не впечатлить,аннотацияОн может быть незаметен, но он есть везде.

Наиболее распространенным является@Override, указывающее, что текущее определение метода переопределит метод родительского класса.Если написание неверно или сигнатура метода не соответствует переопределенному методу, компилятор выдаст сообщение об ошибке.

Поскольку все сказано@OverrideАннотируется, а затем, после тщательного припоминания, предполагается, что что-то всплывет в моей голове.@SuppressWarnningsаннотация. Я до сих пор помню, когда впервые увидел эту аннотацию,MyeclipseТот самый, который побудил меня его использовать, а 3721 мне было все равно, поэтому я его отметил. Позже я узнал, что эта аннотация используется для отключения предупреждений компилятора для классов, методов, переменных-членов и инициализации переменных.

Вышеупомянутые два были упомянуты, так почему бы не попробовать еще один, это может быть наименее распространенным. Это@Deprecated

Не удивляйтесь, что этот класс подчеркнут, потому что@DeprecatedЭффект. Его специфическая функция состоит в том, чтобы идентифицировать методы или классы, которые устарели и не рекомендуются к использованию. Если разработчик использует аннотированный для него элемент, компилятор выдаст предупреждение.

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

Заметки Ченг Ва о первом прохождении

После создания аннотация защищена проверкой типов компилятором. Давайте сначала посмотрим на следующий набор кода для разминки:

public class TestService {

    @MyAnnotation
    public void runTset() {
        System.out.println("annotation test");
    }

}

Не удивляйтесь, в Java нет имени аннотации.MyAnnotation, а как это получилось?Сами сделали.

Потом Гуанзи распродан, а дальше вскроем изготовление аннотаций:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

Таким образом, простая аннотация становится свежеиспеченной. Следует отметить, что это не интерфейс, вам нужно оставить сообщениеinterfaceвпереди еще один@, если этот логотип пропущен, это может иметь огромное значение.

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

Об этом мы и поговорим далее, стучите по доске, внимание!

Мета-аннотации в помощь

При определении аннотаций требуются некоторые метааннотации. Есть два выше, они@Targetи@Retention.

в@Targetиспользуется для определения того, где будет применяться ваша аннотация (например, метод или поле),@RetentionИспользуется для определения уровня доступности аннотации в исходном коде (SOURCE), файл класса (CLASS) Или время выполнения (RUNTIME). Java предоставляет четыре мета-аннотации, а именно:

название полезность
@Target Определяет, где можно использовать эту аннотацию. вElementTypeПараметры включают:
1. CONSTARUCTOR: Объявление конструкторов
2. FIELD: Объявления домена (включая экземпляры enum)
3. LOCAL_VARIABLE: объявление локальной переменной
4. METHOD: объявление метода
5. PACKAGE: объявление пакета
6. TYPE: объявление класса, интерфейса (включая типы аннотаций) или перечисления
@Retention Указывает, на каком уровне необходимо сохранить аннотационную информацию, гдеRetentionPolicyПараметры включают:
1.SOURCE: Примечание будет отброшена компилятором
2.CLASS: аннотации доступны в файлах классов, но отбрасываются виртуальной машиной
3. RUNTIME: виртуальная машина также сохраняет аннотации во время выполнения, поэтому информацию об аннотациях можно прочитать с помощью механизма отражения.
@Documented Включить эту аннотацию в JavaDoc
@Inherited Разрешить подклассам наследовать аннотации родительского класса

Аннотации также классифицируются

Мы создали один в приведенном выше примере@MyAnnotationаннотация.看起来很简单,没什么内容,因此这种注解我们也称为аннотация разметки, аннотации также делятся на несколько категорий:

  • 标记注解: внутри аннотации нет атрибута. Как пользоваться:@Имя аннотации
//定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
  • 单值注解: внутри аннотации есть только одно свойство. Как пользоваться:Имя @annotation (Key = значение)
//定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SingleValueAnnotation {
    String name();
}
//使用
@SingleValueAnnotation(name = "test")
public void singleTest() {}
  • 多值注解:注解内部有过个属性。 Как пользоваться:@имя аннотации(ключ = значение, ключ = значение, ...)
//定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MultiValueAnnotation {
    String name();
    int num();
}
//使用
@MultiValueAnnotation(name = "test", num = 1)
public void multiTest() {}

Значение также имеет значение по умолчанию

когда мы используем не标记注解При использовании аннотации, если вы не присвоите значение атрибуту в аннотации при использовании аннотации, компилятор сообщит об ошибке, указав, что нам нужно присвоить значение.

Это очень неудобно, иногда мы им не пользуемся или значение фиксированное и не хочется писать его повторно, поэтому в этот раз нужно использоватьdefaultКлючевые слова, которые помогут нам решить эту проблему.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MultiValueAnnotation {
    
    String name();
    
    int num() default 0;
}

Мы используем его на атрибутахdefaultключевое слово для объявленияnumЗначение атрибута по умолчанию равно 0, поэтому мы можем использовать приведенную выше аннотацию, не вводя ее вручную.numНазначенный.

Аннотация создателя второго прохода

У аннотаций есть функция, позволяющая компилятору выполнять проверки компиляции, но если нет инструмента для чтения аннотаций, то аннотации будут не более полезными, чем аннотации, по крайней мере, аннотации позволяют разработчикам более интуитивно увидеть полезность этого кода.

заднее отражение

хотите создать и использоватьПроцессор аннотаций, нам также нужно использовать механизм отражения для создания таких инструментов. Вот простой пример:

public class AnnotationHandle {

    public static void track(Class<?> c) {
        for (Method m : c.getDeclaredMethods()) {
            MultiValueAnnotation annotation = m.getAnnotation(MultiValueAnnotation.class);
            if (annotation != null) {
                System.out.println("name:" + annotation.name() +
                        "\n num:" + annotation.num());
            }
        }
    }

    public static void main(String[] args) {
        track(TestService.class);
    }
}

/*  OUTPUT:
  name:test
   num:0
*/

В приведенном выше примере мы использовали два метода отражения:getDeclaredMethods()иgetAnnotation().

вgetDeclaredMethods()Все методы, используемые для возврата класса,getAnnotation()Используется для получения объекта аннотации указанного типа. Если в методе нет такой аннотации, он вернетnullценность.

Доступные типы элементов аннотаций

вышесказанное@MultiValueAnnotationВ аннотации мы определяемStringТипnameиintТипnum, в дополнение к этому мы можем использовать другие типы следующим образом:

  • базовый тип(int, float, boolean и т. д.)
  • String
  • Class
  • enum
  • Annotation
  • Более чем один тип массива

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

Ограничения для значений по умолчанию

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

Базовый элемент не существуетnullЗначение, поэтому для неосновных типов элементов, независимо от того, используется ли оно, объявлено ли оно или когда определено,Ни один из них не может иметь нулевое значение в качестве значения. Поэтому в реальной разработке мы часто определяем некоторые специальные значения как несуществующие идентификаторы, такие какотрицательное числоилипустой строки

Три прохода

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

Аннотации также могут быть вложены

При изменении элемента аннотации мы видим, что можем использоватьAnnotationПо оценкам, чтобы изменить его, он будет чувствовать себя немного странно, когда вы его увидите. Здесь, чтобы раскрыть секрет для вас.

Давайте сначала посмотрим на набор аннотаций:

@Constraints

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
    boolean primaryKey() default false;
    boolean unique() default false;
}

@SQLString

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
    String name() default "";
    Constraints constraints() default @Constraints;
}

мы в@SQLStringиспользуется в аннотацияхConstraintsЭлементы аннотации, и значение по умолчанию установлено@Constraints. В настоящее времяConstraintsЗначения в@ConstraintsЗначение по умолчанию, определенное в аннотации, если мы хотим использовать пользовательский, способ выглядит следующим образом:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
    String name() default "";
    Constraints constraints() default @Constraints(primaryKey = true);
}

Таким образом, мы можем использовать наши собственные определенныеvalue

Аннотации не поддерживают наследование

мы не можем использоватьextendsНаследовать определенный@interfaceНо это раздражение может быть решено путем вложенности.

Сочетание АОП и аннотаций

AOPМы знакомы с сегодняшним развитием, поэтомуAOPианнотацияКакая химическая реакция может произойти, смотрите следующий код:

@ApiLog:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ApiLog {
    /**
     * 接口名称
     */
    String name();
}

使用:

@GetMapping(value = "/getConfig")
@ApiLog(name = "获取系统相关配置")
public Result getConfig() throws Exception {
    return sendOK(SystemService.getConfig(type));
}

Aop使用:

@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private LogService logService;
    
    @Pointcut("@annotation(cbuc.life.annotation.ApiLog)")
    public void logPointCut() {        
    }

    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //执行方法
        Object result = point.proceed();
        //执行时长(毫秒)
        long time = System.currentTimeMillis() - beginTime;
        //保存日志
        saveSysLog(point, time);
        return result;
    }

    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        LogEntity log = new LogEntity();
        ApiLog apiLog = method.getAnnotation(ApiLog.class);
        if(apiLog != null){
            //注解上的描述
            log.setMethodDescribe(syslog.value());
        }

        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        log.setMethod(className + "." + methodName + "()");

        //请求的参数
        Object[] args = joinPoint.getArgs();
        String params = JSON.toJSONString(args[0]);
        log.setParams(params);

        //获取request
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        //设置IP地址
        log.setIp(ServletUtil.getIpAddress(request));

        //用户名
        String username = LoginInfo.getUsername();
        log.setUsername(username);

        //保存系统日志
        logService.save(log);
    }
}

С помощью приведенного выше кода мы можем увеличить метод, который ожидает записи журнала.@ApiLogАннотация, действие метода будет записано в таблицу журнала, независимо от того, как называется метод или где находится класс, его можно легко решить, и нет вторжения в код!

На данный момент мы успешно прошли три уровня. Я думаю, вы полностью поняли, как использовать аннотации. Это конец этого выпуска аннотаций. Помните:Не переставай учиться из-за того, что ты маленький, и не сдавайся из-за того, что ты большой.

看完不赞,都是坏蛋

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

Я посуду, а ты учишься с мужчиной. 💋

Официальный аккаунт WeChat открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!