什么是注解这些东西请看 think in java
在这个实例中演示的是注解的创建和利用反射原理去获取代码信息
1、解释本实例用到的注解及解释
2、创建注解
3、创建使用注解的类
4、利用反射机制去解析类代码信息
============================================================================================
1、注解的方法不能有参数
注解的返回类型是 “基本类型” “字符串” “枚举” “Class” “返回类型的数组”
注解可以添加元注解:
Documented:将此注解包在javadoc中
Target:表示该注解用在什么地方,method:声明方法
Inherited:表示继承父类中的注解
Retention:表示在什么级别保存该注解信息,RetentionPolicy.RUNTIME:运行期 间保留
2、
- 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()*/
- }