介绍
- 简介
- Java注解提供了关于代码的一些信息, 但并不直接作用于它所注解的代码内容。在这个教程当中, 我们将学习Java的注解, 如何定制注解, 注解的使用以及如何通过反射解析注解。
创建Java自定义注解
- 介绍
- 创建自定义注解和创建一个接口相似, 但是注解的interface关键字需要以@符号开头。我们可以为注解声明方法。我们先来看看注解的例子, 然后我们将讨论他的一些特性。
- 描述
- 注解方法不能带有参数。
- 注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组。
- 注解方法可以有默认值。
- 注解本身能够包含元注解, 元注解被用来注解其它注解。
- 这里有四种类型的元注解:
- @Documented —— 指明拥有这个注解的元素可以被javadoc此类的工具文档化。
- @Target——指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE[类型], METHOD[方法], CONSTRUCTOR[构造函数], FIELD[反射]等。
- @Inherited——指明该注解类型被自动继承。
- @Retention——指明了该Annotation被保留的时间长短。
- 声明注解函数类
/**
* 声明注解
*/
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
String author() default "靳露露";
String date();
int revision() default 1;
String comments();
}
我们来看一个Java内建注解的例子参照上边提到的自定义注解。
/**
* 注解示例
*/
public class AnnotationExample {
public static void main(String[] args) {
genericsTest();
}
// toString
@Override
@MethodInfo(author = "靳瑶瑶", comments = "Main method", date = "2012 年 11 月 17 日", revision = 1)
public String toString() {
return "覆盖 toString 方法";
}
// 已弃用的方法
@Deprecated
@MethodInfo(comments = "deprecated method", date = "2012 年 11 月 17 日")
public static void oldMethod() {
System.out.println("老方法, 别用了。");
}
// 取消警告 检查、警告
@SuppressWarnings({"unchecked", "deprecation"})
@MethodInfo(author = "靳瑶瑶", comments = "Main method", date = "2012 年 11 月 17 日", revision = 10)
public static void genericsTest() {
List<String> list = new ArrayList();
Collections.addAll(list, "abc");
System.out.println(JSON.toJSON(list));
oldMethod();
}
}
Java注解解析
- 我们将使用反射技术来解析Java类的注解。那么注解的 RetentionPolicy[定义] 应该设置为RUNTIME否则Java类的注解信息在执行过程中将不可用, 那么我们也不能从中得到任何和注解有关的数据。
/**
* 注解解析
*/
public class AnnotationParsing {
public static void main(String[] args) {
try {
for (Method method : AnnotationParsing.class
.getClassLoader()
.loadClass(("com.example.demo.Demo.test.AnnotationExample"))
.getMethods()) {
// 判断loadClass类中方法时候使用MethodInfo注释
if (method.isAnnotationPresent(com.example.demo.Demo.util.MethodInfo.class)) {
try {
// 迭代方法中可用的所有注释
for (Annotation anno : method.getDeclaredAnnotations()) {
System.out.println("方法中的注解 : " + anno);
}
MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
if (methodAnno.revision() == 1) {
// System.out.println("修订号为1的方法 = " + method);
// TODO: 修订号为1的方法 = public java.lang.String com.example.demo.Demo.test.AnnotationExample.toString()
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
} catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出
- 文本
方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳瑶瑶, revision=1, comments=Main method, date=2012 年 11 月 17 日)
方法中的注解 : @java.lang.Deprecated()
方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳露露, revision=1, comments=deprecated method, date=2012 年 11 月 17 日)
方法中的注解 : @com.example.demo.Demo.util.MethodInfo(author=靳瑶瑶, revision=10, comments=Main method, date=2012 年 11 月 17 日)
Java内建注解
- 常见注解
- Java提供了三种内建注解。
- @Override——当我们想要复写父类中的方法时, 我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
- @Deprecated——当我们希望编译器知道某一方法不建议使用时, 我们应该使用这个注解。Java在javadoc 中推荐使用该注解, 我们应该提供为什么该方法不推荐使用以及替代的方法。
- @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息, 例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。
默认传参