注解
@SuppressWarnings(“deprecation”)的功能是什么?_Java专项练习_牛客网 (nowcoder.com)
Override 注解
指明被注解的方法需要覆写超类中的方法.
如果某个方法使用了该注解,却没有覆写超类中的方法(比如大小写写错了,或者参数错了,或者是子类自己定义的方法),编译器就会生成一个错误.
Deprecated 注解
可以修饰类、方法、变量,在java源码中被@Deprecated修饰的类、方法、变量等表示不建议使用的,可能会出现错误的,可能以后会被删除的类、方法等,如果现在使用,则在以后使用了这些类、方法的程序在更新新的JDK、jar包等就会出错,不再提供支持。 个人程序中的类、方法、变量用@Deprecated修饰同样是不希望自己和别人在以后的时间再次使用此类、方法。 当编译器编译时遇到了使用@Deprecated修饰的类、方法、变量时会提示相应的警告信息。
Suppresswarnings 注解
可以达到抑制编译器编译时产生警告的目的,但是很不建议使用@SuppressWarnings注解,使用此注解,编码人员看不到编译时编译器提示的相应的警告,不能选择更好、更新的类、方法或者不能编写更规范的编码。同时后期更新JDK、jar包等源码时,使用@SuppressWarnings注解的代码可能受新的JDK、jar包代码的支持,出现错误,仍然需要修改。
啥是注解:
注解就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,从而做相对应的处理。
注解跟注释很像,区别是注释是给人看的(想想自己遇到那些半句注释没有的业务代码,还是不是很难受?);而注解是给程序看的,它可以被编译器读取。
注解本质上就是接口。
定义一个注解: 由@interface
声明。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface testAnno{
String value() default "value-Annotation";
String name() default "liuer";
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface AnnoByMethod{
String value() default "value-MethodAnnotation";
String name() default "zher";
}
定义一个注解需要元注解做一些限制:
元注解
用来标记注解的注解,自定义注解需要用到。
-
@Retention
确定注解的生效范围:-
//指定注解的作用范围,三种,其value为
RetentionPolicy
的枚举常量:@Retention(RetentionPolicy.RUNTIME)
- SOURCE, 在
.java
中生效 - CLASS, 在
.class
文件中生效 - RUNTIME 在运行时生效(JVM)
生命周期大小排序为
SOURCE < CLASS < RUNTIME
,- 如果要在编译时进行一些预处理操作,就用 CLASS 注解
- 如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
- SOURCE, 在
-
-
@Target
// 指定注解可以在哪些地方使用其value为
ElementType
的枚举常量 eg:@Target(ElementType.TYPE)
-
@Documented
//指定该注解是否会在 javadoc 体现 -
@Inherited
//子类会继承父类注解 -
@Repeatable
:可在一注解基础上多次使用 -
@Native
:使用 @Native 注解修饰成员变量,则表示这个变量可以被本地代码引用
自定义注解
不会 Java 注解 ? 看这一篇文章! - 知乎 (zhihu.com)
一文助你了解java注解到底是怎么回事 - 知乎 (zhihu.com)
java注解-最通俗易懂的讲解 - 知乎 (zhihu.com)
注解与反射
-
通过 Class 对象的
isAnnotationPresent()
方法判断它是否应用了某个注解public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
-
通过 getAnnotation() 方法来获取 Annotation 对象。
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
- 或者是 getAnnotations() 方法。
public Annotation[] getAnnotations() {}
测试通过反射获取注解信息/属性:
@testAnno(value = "anno")
public class test {
@AnnoByMethod(value = "method")
public String getValue(){
return "";
}
public static void main(String[] args) throws NoSuchMethodException {
// 获取到 test的Class类
Class<? extends test> aClass = test.class;
// 得到 其getValue方法
Method method = aClass.getMethod("getValue");
// 得到注解类 testAnno
System.out.println(method.isAnnotationPresent(AnnoByMethod.class));
AnnoByMethod annotationByMethod = method.getAnnotation(AnnoByMethod.class);
System.out.println("name-- "+annotationByMethod.name());
System.out.println("value-- "+annotationByMethod.value());
System.out.println(aClass.isAnnotation());
System.out.println(aClass.isAnnotationPresent(testAnno.class));
testAnno annotationByClass = aClass.getAnnotation(testAnno.class);
System.out.println("name-- "+annotationByClass.name());
System.out.println("value-- "+annotationByClass.value());
try {
}catch (Exception e){
e.printStackTrace();
}
}
}