注解的作用:
- 提高我们的开发效率
- 更早的发现程序的问题或者错误
- 更好的增加代码的描述能力
- 更加利于我们的一些规范约束
- 提供解决问题的更优解
- 使用Java注解和Android注解,能大幅度的提高我们的开发效率已经开发过程中的及时校验,避免一些因开发者疏忽而导致的问题,非常的实用!
Java内置注解
@Deprecated
@Override
@SuppressWarnings
下面分别来介绍它们的区别和使用
- @Deprecated
这个注释是一个标记注释。所谓标记注释,就是在源程序中加入这个标记后,并不影响程序的编译,但有时编译器会显示一些警告信息; 那么Deprecated注释是什么意思呢?如果你经常使用eclipse等IDE编写java程序时,可能会经常在属性或方法提示中看到这个词。如果某个类成员的提示中出现了个词,就表示这个并不建议使用这个类成员。因为这个类成员在未来的JDK版本中可能被删除。之所以在现在还保留,是因为给那些已经使用了这些类成员的程序一个缓冲期。如果现在就去了,那么这些程序就无法在新的编译器中编译了;
可以用来标记类,方法,属性。
如果上述三种元素不再使用,使用@Deprecated注解
如果代码使用了@Deprecated注解的类,方法或属性,编译器会进行警告 - @Override
这个注释的作用是标识某一个方法是否覆盖了它的父类的方法。
实际上在子类中重写父类或接口的方法,@Overide并不是必须的。但是还是建议使用这个注解,在某些情况下,假设你修改了父类的方法的名字或者是子类的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息 - @SuppressWarnings
当我们的一个方法调用了弃用的方法或者进行不安全的类型转换,编译器会生成警告。我们可以为这个方法增加@SuppressWarnings注解,来抑制编译器生成警告
@SuppressWarnings用来抑制编译器生成警告信息。可以修饰的元素为类,方法,方法参数,属性,局部变量
使用@SuppressWarnings注解,采用就近原则,比如一个方法出现警告,我们尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。虽然两个都能抑制编译器生成警告,但是范围越小越好,因为范围大了,不利于我们发现该类下其他方法的警告信息。
元注解
- Documented 表示含有该注解类型的元素(带有注释的)会通过javadoc或类似工具进行文档化
- Inherited 表示注解类型能被自动继承
- Retention 表示注解类型的存活时长
保留策略 | 解释 |
---|---|
SOURC | 仅存在Java源文件,经过编译器后便丢弃相应的注解 |
CLASS | 存在Java源文件,以及经编译器后生成的Class字节码文件,但在运行时VM不再保留注释 |
RUNTIME | 存在源文件、编译生成的Class字节码文件,以及保留在运行时VM中,可通过反射性地读取注解 |
- Target 表示注解类型所适用的程序元素的种类
程序元素 | 解释 |
---|---|
TYPE | 类、接口(包括注解类型)或枚举声明 |
CONSTRUCTOR | 构造方法声明 |
PACKAGE | 包声明 |
LOCAL_VARIABLE | 局部变量声明 |
METHOD | 方法声明 |
ANNOTATION_TYPE | 注解类型声明 |
PARAMETER | 参数声明 |
FIELD | 字段声明(包括枚举常量) |
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
自定义注解使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface User {
String name();
int age();
}
@User(name = "hello", age = 12)
public class WriterTest {
@Writer(name = "world", age = 10)
public void writeBlog() {
System.out.println("writing blog");
}
}
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("***.WriterTest");
if (c.isAnnotationPresent(Writer.class)) {
Writer w = (Writer) c.getAnnotation(Writer.class);
System.out.println("name:" + w.name() + " age:" + w.age());
}
Method[] methods = c.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Writer.class)) {
Writer w = method.getAnnotation(Writer.class);
System.out.println("name:" + w.name() + " age:" + w.age());
}
}
}
参考链接
Java-注解详解https://blog.csdn.net/forezp/article/details/78026146
Java-注解详解https://blog.csdn.net/wzgiceman/article/details/53406248
android-注解详解https://blog.csdn.net/wzgiceman/article/details/53483665