解析注解

Java 5开始,java.lang.reflect包下的反射API可以在运行时读取Annotation。

应用:定义一个自动执行方法的注解,解析注解、通过反射执行方法,替代配置文件。

package ah.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//==============================================
//注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface AutoMethod {
String className();
String methodName();
}
// ==============================================
// 想要调用的类和方法
class Cat {
public void show() {
System.out.println("Cat show");
}
}
// ==============================================
// 测试类
@AutoMethod(className = "ah.annotation.Cat", methodName = "show")
public class TestParseAnn {
public static void main(String[] args) {
// 1.获取类的字节码对象
Class<TestParseAnn> cls = TestParseAnn.class;
// 2.获取注解对象
AutoMethod ann = cls.getAnnotation(AutoMethod.class);
// 3.调用注解对象的抽象方法,获取返回值
String className = ann.className();
String methodName = ann.methodName();
System.out.println("获取到类名:" + className);
System.out.println("获取到方法名:" + methodName);
// 使用反射集合调用方法(略)
}
}
获取到类名:ah.annotation.Cat
获取到方法名:show

例:使用注解进行方法测试

注解传入的变量:B

方法public static void ah.AnnoTestExample.m3(java.lang.String)运行失败,异常:java.lang.IllegalArgumentException: 参数出错!

注解传入的变量:御弟

--m1--:御弟

共运行了:2个方法,其中:

失败了:1个,

成功了:1个!

package ah.annotation;
import java.lang.annotation.*;
import java.lang.reflect.Method;
//============================================
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Inherited
@interface AnnoTest {
// 注解的属性:
String name() default "御弟";
}
// ============================================
// 使用自定义注解的类
class AnnoTestExample {
@AnnoTest
public static void m1(String _name) {
System.out.println("--m1--:" + _name);
}
public static void m2() {
System.out.println("这个方法不测试");
}
@AnnoTest(name = "B")
public static void m3(String _name) {
if (_name.equals("B")) {
throw new IllegalArgumentException("参数出错!");
} else {
System.out.println("--m3--:" + _name);
}
}
}
// ============================================
// APT:Annotation Processor Test(注解处理工具)
class APT {
public static void process(String className) throws ClassNotFoundException {
int passed = 0;
int failed = 0;
Class<?> _class = Class.forName(className);
for (Method m : _class.getMethods()) {
// 如果该方法使用了@注解
if (m.isAnnotationPresent(AnnoTest.class)) {
// 获取注解中的变量
AnnoTest ann = m.getAnnotation(AnnoTest.class);
String name = ann.name();
System.out.println(" 注解传入的变量:" + name);
try {
// 调用m方法
m.invoke(_class, name);
// *方法无参数可直接传入null:
// m.invoke(null);
// 测试成功,passed计数器加1
passed++;
} catch (Exception ex) {
System.out.println("方法" + m + "运行失败,异常:" + ex.getCause());
// 测试出现异常,failed计数器加1
failed++;
}
}
}
// 统计测试结果
System.out.println("共运行了:" + (passed + failed) + "个方法,其中:\n" + "失败了:"
+ failed + "个,\n" + "成功了:" + passed + "个!");
}
}
/**
* 测试类,主方法
*/
public class TestMyAnnotation {
public static void main(String[] args) throws ClassNotFoundException {
String _包类名 = "ah.annotation.AnnoTestExample";
APT.process(_包类名);
}
}
 注解传入的变量:B
方法public static void ah.annotation.AnnoTestExample.m3(java.lang.String)运行失败,异常:java.lang.IllegalArgumentException: 参数出错!
注解传入的变量:御弟
--m1--:御弟
共运行了:2个方法,其中:
失败了:1个,
成功了:1个!

Java基础教程——解析注解的更多相关文章

  1. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  2. Java基础教程(16)--注解

    一.注解基础知识 1.注解的格式   最简单的注解就像下面这样: @Entity   @符号指示编译器其后面的内容是注解.在下面的例子中,注解的名称为Override: @Override void ...

  3. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  4. Java基础教程(25)--I/O

    一.I/O流   I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等.   流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...

  5. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  6. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  7. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  8. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  9. Java基础教程(5)--变量

    一.变量 1.变量的定义   正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...

随机推荐

  1. JavaScript监听滚动条的进度条

    <style type="text/css"> *{ margin: 0; padding: 0; } .g-box{ width: 100%; height: 400 ...

  2. 三年工作经验,从小厂离职后,我凭什么拿到了阿里的offer

    本篇文章主要记录分享我的面试准备过程. 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话"要么钱没给到位,要么心委屈了",想必大家耳熟能详了,我这里再细说一下我个人离职原因 ...

  3. Amdocs收购OPENET:关于5G应用落地的思考

    今年8月,全球通讯和媒体领导者之一Amdocs收购了Openet.在VoltDB,听到这个消息,我们感到非常高兴和自豪!在过去的7年里,我们一直是Openet解决方案的基础数据平台. 尽管许多供应商仍 ...

  4. LWJGL3的内存管理

    LWJGL3的内存管理 LWJGL3 (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.&l ...

  5. Elasticsearch 第六篇:聚合统计查询

    h2.post_title { background-color: rgba(43, 102, 149, 1); color: rgba(255, 255, 255, 1); font-size: 1 ...

  6. Linux 环境下 C++ 的开发编译

    Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...

  7. 漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃monkey日志

    漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃日志 1.APP崩溃率标准 开发或测试app的同学,对于app崩溃肯定非常熟悉,频繁的线上崩溃属 ...

  8. XJOI 夏令营501-511NOIP训练14 砍树(2)

    小A是小B家的园丁.小B的家里有n棵树,第i棵树的横坐标为i.一天,小B交给小A一个任务,让他降低自己家中的某些树木的高度.这个任务对小A来说十分简单,因为他有一把极其锋利的斧头和一门独门砍树秘籍,能 ...

  9. 17、ContentType组件

    一 项目背景 路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题: ​ 1 如何设计表结构,来表示这种规则 ​ 2 为专题课,添加三个价格策略 ​ 3 查询所有价格策略,并且显示对应 ...

  10. centos常用指令之-卸载

    卸载centos自带java: rpm -qa|grep java // 查询javax相关 xxxxxxxxxxxxxx # 卸载1.2方式 # 1 yum -y remove java xxxxx ...