Привет всем, я Сяо Цай, Сяо Цай, который хочет быть Цай Буцаем в интернет-индустрии. Она может быть мягкой или жесткой, как она мягкая, а белая проституция жесткая!Черт~ Не забудьте поставить мне тройку после прочтения!
Эта статья в основном знакомит
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 открыт,Хорошая еда, студенты, которые не обратили внимания, не забудьте обратить внимание!