什么是注解这些东西请看 think in java
在这个实例中演示的是注解的创建和利用反射原理去获取代码信息
1、解释本实例用到的注解及解释
2、创建注解
3、创建使用注解的类
4、利用反射机制去解析类代码信息
============================================================================================
1、注解的方法不能有参数
注解的返回类型是 “基本类型” “字符串” “
枚举” “Class” “返回类型的数组”
注解可以添加元注解:
Documented:将此注解包在javadoc中
Target:表示该注解用在什么地方,method:声明方法
Inherited:表示继承父类中的注解
Retention:表示在什么级别保存该注解信息,RetentionPolicy.RUNTIME:运行期 间保留
2、
class="java" name="code">
package com.gyj.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 创建注解
* @author GYJ
* @date 2014-3-23
*/
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
String author() default "gyj";
String date();
int revision() default 1;
String comments();
}
3、
package com.gyj.annotation;
import java.util.ArrayList;
import java.util.List;
public class AnnotationExample {
/**
* @param args
*/
public static void main(String[] args) {
}
@Override
@MethodInfo(author = "gyj", comments = "main method", date = "2014", revision = 1)
public String toString() {
return "overriden to string method";
}
@Deprecated
@MethodInfo(comments = "method1", date = "2019")
public static void oldMethod() {
System.out.println("old method don't use it");
}
@SuppressWarnings({"unchecked", "deprecation"})
@MethodInfo(author = "gyj", comments = "main genericsTest", date = "2015", revision = 2)
public static void genericsTest() {
List l = new ArrayList<>();
l.add("abc");
//发出警告
oldMethod();
}
}
4、
package com.gyj.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationParsing {
/**
* 解析注解
* @param args
*/
public static void main(String[] args) {
try {
Method[] method = Class.forName("com.gyj.annotation.AnnotationExample").getMethods();
for (Method method1 : method) {
//验证MethodInfo注解是否可以继承
if (method1.isAnnotationPresent(com.gyj.annotation.MethodInfo.class)) {
for (Annotation annotation : method1.getAnnotations()) {
//具体的注解信息和方法
System.out.println("注解" + annotation + "存在方法" + method1 + "\n");
}
//根据注解信息条件性的做出操作
MethodInfo methodInfo = method1.getAnnotation(MethodInfo.class);
if (methodInfo.revision() == 1) {
System.out.println("revision 是 1 的方法是 " + methodInfo);
}
}
}
} catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//out put===========================
/*注解@com.gyj.annotation.MethodInfo(author=gyj, revision=1, comments=main method, date=2014)存在方法public java.lang.String com.gyj.annotation.AnnotationExample.toString()
revision 是 1 的方法是 @com.gyj.annotation.MethodInfo(author=gyj, revision=1, comments=main method, date=2014)
注解@java.lang.Deprecated()存在方法public static void com.gyj.annotation.AnnotationExample.oldMethod()
注解@com.gyj.annotation.MethodInfo(author=gyj, revision=1, comments=method1, date=2019)存在方法public static void com.gyj.annotation.AnnotationExample.oldMethod()
revision 是 1 的方法是 @com.gyj.annotation.MethodInfo(author=gyj, revision=1, comments=method1, date=2019)
注解@com.gyj.annotation.MethodInfo(author=gyj, revision=2, comments=main genericsTest, date=2015)存在方法public static void com.gyj.annotation.AnnotationExample.genericsTest()*/
}