自定义Java annotation及解析和使用

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 自定义Java annotation及解析和使用

自定义Java annotation及解析和使用

package annotationTest;
import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
    String author() default "Jerry";
    String version() default "1.0";
    String date();
    String comment();
}

新建一个类,给其方法添加上刚才创建的注解:

package annotationTest;
// Jerry change for demo
public class AnnotationExample {
    @Override
    @MethodInfo(author = "xxx",version = "1.0",date = "2015/03/26",comment = "override toString()")
    public String toString() {
        return "AnnotationExample{}";
    }
    @Deprecated
    @MethodInfo(comment = "deprecated method", date = "2015/03/26")
    public static void oldMethod() {
        System.out.println("old method, don't use it.");
    }
    @MethodInfo(author = "Pankaj", comment = "Main method", date = "Nov 17 2012", version = "1.0")
    public static void genericsTest() {
        oldMethod();
    }
}

打印的输出:

@annotationTest.MethodInfo(version="1.0", author="xxx", date="2015/03/26", comment="override toString()") in method:public java.lang.String annotationTest.AnnotationExample.toString()
Method with revision no 1.0 = public java.lang.String annotationTest.AnnotationExample.toString()
@annotationTest.MethodInfo(version="1.0", author="Pankaj", comment="Main method", date="Nov 17 2012") in method:public static void annotationTest.AnnotationExample.genericsTest()
Method with revision no 1.0 = public static void annotationTest.AnnotationExample.genericsTest()
@java.lang.Deprecated(forRemoval=false, since="") in method:public static void annotationTest.AnnotationExample.oldMethod()
@annotationTest.MethodInfo(version="1.0", author="Jerry", comment="deprecated method", date="2015/03/26") in method:public static void annotationTest.AnnotationExample.oldMethod()
Method with revision no 1.0 = public static void annotationTest.AnnotationExample.oldMethod()

同理,新建一个description注解,用来修饰People类:

package annotationTest;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.*;
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
   String desc();
   String author();
   int age() default 18;
}
package annotationTest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@Description(author = "Jerry", desc = "Class annotation", age = 35)
public class People {
  @Description(author = "Jerry 2", desc = "method annotation", age = 35)
  public void hello(){
  }
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public static void main(String[] arg){
          try {
              // 使用类加载器加载类
              Class c = Class.forName("annotationTest.People");
              // 找到类上面的注解
              boolean isExist = c.isAnnotationPresent(Description.class);
              // 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解
              if (isExist) {
                  // 拿到注解实例,解析类上面的注解
                Description d = (Description) c.getAnnotation(Description.class);
                  System.out.println(d.desc());
              }
            //获取所有的方法
              Method[] ms = c.getMethods();
              // 遍历所有的方法
              for (Method m : ms) {
                  boolean isExist1 = m.isAnnotationPresent(Description.class);
                  if (isExist1) {
                      Description d1=m.getAnnotation(Description.class);
                      System.out.println(d1.desc());
                  }
              }
            //另一种解析方法
              for (Method m : ms) {
                  //拿到方法上的所有的注解
                  Annotation[] as=m.getAnnotations();
                  for (Annotation a : as) {
                      //用二元操作符判断a是否是Description的实例
                      if (a instanceof Description) {
                          Description d=(Description) a;
                          System.out.println(d.desc());
                      }
                  }
              }
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          }
      }
  }

image.png

相关文章
|
4天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
12 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
6天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
18 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
9天前
|
IDE Java 开发工具
java自定义异常20
java自定义异常20
15 3
|
12天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
39 6
|
9天前
|
监控 算法 Java
深入解析Java中的垃圾回收机制
本文旨在全面解析Java的垃圾回收机制,探讨其工作原理、常见算法以及在实际开发中的应用。通过对这一重要主题的深入分析,希望帮助读者更好地理解Java虚拟机(JVM)如何管理内存,从而编写出更高效、稳定的Java应用程序。
|
8天前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
9天前
|
Java 开发者
Java中的异常处理机制深度解析
在Java编程中,异常处理是保证程序稳定性和健壮性的重要手段。本文将深入探讨Java的异常处理机制,包括异常的分类、捕获与处理、自定义异常以及一些最佳实践。通过详细讲解和代码示例,帮助读者更好地理解和应用这一机制,提升代码质量。
12 1
|
10天前
|
分布式计算 Java API
深入解析Java中的Lambda表达式及其应用
本文将深入探讨Java中Lambda表达式的定义、优势及其在实际编程中的应用。通过具体示例,帮助读者更好地理解和使用这一强大的编程工具。
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
20 2
|
10天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面