aop 获取注解注释的方法_带有AOP和注释的Java方法记录

aop 获取注解注释的方法

有时,我想记录(通过slf4j和log4j )方法的每次执行,查看其接收的参数,返回的内容以及每次执行花费的时间。 这是我在AspectJ , jcabi-aspects和Java 6注释的帮助下所做的事情:

public class Foo {@Loggablepublic int power(int x, int p) {return Math.pow(x, p);}
}

这是我在log4j输出中看到的:

[INFO] com.example.Foo #power(2, 10): 1024 in 12μs
[INFO] com.example.Foo #power(3, 3): 27 in 4μs

很好,不是吗? 现在,让我们看看它是如何工作的。

带有运行时保留的注释

注释是Java 6中引入的一种技术。它是一种元编程工具,它不会改变代码的工作方式,但会为某些元素(方法,类或变量)提供标记。 换句话说,注释只是附加到可以查看和阅读的代码的标记。 有些注释仅在编译时可见-编译后在.class文件中不存在。 其他的在编译后仍然可见,并且可以在运行时访问。

例如, @Override是第一种类型(其保留类型是SOURCE ),而来自JUnit的@Test是第二种类型(保留类型是RUNTIME )。 @Loggable (我在上面的脚本中使用的那个)是jcabi-aspects中第二种类型的注释。 编译后,它与.class文件中的字节码保持在一起。

同样,重要的是要理解,即使对power()方法进行了注释和编译,它到目前为止也不会向slf4j发送任何内容。 它仅包含一个标记,上面写着“请记录我的执行情况”。

面向方面的编程(AOP)

AOP是一种有用的技术,它允许在不显式更改源代码的情况下将可执行块添加到源代码。 在我们的示例中,我们不想在类内部记录方法的执行情况。 相反,我们希望其他类拦截对方法power()每次调用,测量其执行时间,然后将此信息发送给slf4j。

我们希望该拦截器理解我们的@Loggable批注并记录对该特定方法power()每次调用。 而且,当然,相同的拦截器应用于将来我们将放置相同批注的其他方法。

这种情况完全符合AOP的初衷-避免在多个类中重新实现某些常见行为。

日志记录是我们主要功能的补充功能,我们不想使用多个日志记录指令来污染我们的代码。 相反,我们希望在后台进行日志记录。

就AOP而言,我们的解决方案可以解释为创建一个方面 ,该方面在某些连接点横切代码,并应用环绕建议以实现所需的功能。

纵横比

让我们看看这些魔术词的含义。 但是,首先,让我们看一下jcabi-aspects如何使用AspectJ实现它们(这是一个简化的示例,您可以在MethodLogger.java找到完整的代码):

@Aspect
public class MethodLogger {@Around("execution(* *(..)) && @annotation(Loggable)")public Object around(ProceedingJoinPoint point) {long start = System.currentTimeMillis();Object result = point.proceed();Logger.info("#%s(%s): %s in %[msec]s",MethodSignature.class.cast(point.getSignature()).getMethod().getName(),point.getArgs(),result,System.currentTimeMillis() - start);return result;}
}

这是一个方面 ,里面有一个关于 around() 建议 。 方面用@Aspect注释,而建议用@Around注释。 如上所述,这些注释只是.class文件中的标记。 除了为那些对运行时感兴趣的人提供一些元信息外,他们什么也不做。

注释@Around有一个参数,在这种情况下,该参数表示在以下情况下建议应适用于方法:

  1. 其可见性修饰符为*publicprotectedprivate );
  2. 它的名字是名字* (任何名字);
  3. 它的参数是.. (任何参数); 和
  4. 它用@Loggable注释

如果要截获对带注释的方法的调用,则在执行实际方法之前,先执行方法around() 。 当要拦截对power()方法的调用时, around()方法将接收ProceedingJoinPoint类的实例,并且必须返回一个对象,该对象将作为power()方法的结果使用。

为了调用原始方法power() ,建议必须调用连接点对象的proceed()

我们编译此方面,并使其与主文件Foo.class一起在classpath中可用。 到目前为止,一切都很好,但是我们需要采取最后一步,以便将我们的方面付诸实践-我们应该应用我们的建议。

二元方面编织

方面编织是建议应用过程的名称。 Aspect Weaver通过注入对Aspect的调用来修改原始代码。 AspectJ正是这样做的。 我们给它提供了两个二进制Java类Foo.classMethodLogger.class ; 它给退三-修改Foo.classFoo$AjcClosure1.class和未修改MethodLogger.class

为了了解哪些建议应应用于哪些方法,AspectJ weaver使用了.class文件中的注释。 同样,它使用反射来浏览类路径上的所有类。 它通过@Around注释分析哪些方法满足条件。 当然,它找到我们的方法power()

因此,有两个步骤。 首先,我们使用javac编译.java文件,并获得两个文件。 然后,AspectJ编织/修改它们并创建自己的额外类。 编织后,我们的Foo类如下所示:

public class Foo {private final MethodLogger logger;@Loggablepublic int power(int x, int p) {return this.logger.around(point);}private int power_aroundBody(int x, int p) {return Math.pow(x, p);}
}

AspectJ weaver将我们的原始功能移至新方法power_aroundBody() ,并将所有power()调用重定向到方面类MethodLogger

现在,我们有四个类一起工作,而不是Foo类中的power()方法。 从现在开始,这就是每次调用power()幕后发生的事情:

未命名

方法power()原始功能由图中的绿色小生命线指示。

如您所见,方面编织过程将类和方面连接在一起,并通过连接点在它们之间转移调用。 无需编织,类和方面都只是带有附加注释的已编译Java二进制文件。

jcabi方面

jcabi-aspects是一个JAR库,其中包含Loggable注释和MethodLogger方面(顺便说一句,还有更多方面和注释)。 您无需编写自己的方面来记录方法。 只需在类路径中添加一些依赖项,然后配置jcabi-maven-plugin进行编织(在Maven Central中获取其最新版本):

<project><depenencies><dependency><dependency><groupId>com.jcabi</groupId><artifactId>jcabi-aspects</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId></dependency></dependency></depenencies><build><plugins><plugin><groupId>com.jcabi</groupId><artifactId>jcabi-maven-plugin</artifactId><executions><execution><goals><goal>ajc</goal></goals></execution></executions></plugin></plugins></build>
</project>

由于此编织过程需要大量的配置工作,因此我创建了一个具有ajc目标的便捷Maven插件,该插件可以完成整个方面的编织工作。 您可以直接使用AspectJ,但是我建议您使用jcabi-maven-plugin 。

而已。 现在,您可以使用@com.jcabi.aspects.Loggable注释,您的方法将通过slf4j记录。

如果某些内容无法按照说明进行操作,请立即提交Github问题 。

相关文章

您可能还会发现以下有趣的帖子:

  • 如何重试异常的Java方法调用
  • 缓存Java方法结果
  • 摆脱Java静态记录器
  • 限制Java方法执行时间
  • 简单的Java SSH客户端

翻译自: https://www.javacodegeeks.com/2014/09/java-method-logging-with-aop-and-annotations.html

aop 获取注解注释的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 合并word文件,在Python上的WordCloud中,我想合并两种语言

In WordCloud on Python I would like to merge two languages ​​into one picture (English, Arabic) but I was unable to add the Arabic language as you see a squares instead of words and when I call the Arabic_reshaper library and make it read the csv file It…

central maven_一键发布到Maven Central的方法

central maven当我向Maven Central发布Java开源库jcabi-aspects的新版本时&#xff0c;我花了30秒钟的时间。 甚至更少。 最近&#xff0c;我发布了版本0.17.2。 您可以在Github第80期中看到所有情况&#xff1a; 如您所见&#xff0c;我向Rultor发出了命令&#xff0c;它向Ma…

防热服的设计数学建模_全国大学生数学建模和电子设计赛,这所驻青高校获奖山东最多...

全省百余高校参加全国数学建模竞赛&#xff0c;本科组32队获一等奖、78队获二等奖&#xff1b;青岛理工大学获本科组国家一等奖5项、二等奖7项&#xff0c;获山东赛区一等奖28项、二等奖17项&#xff0c;获奖数量山东第一、全国第二。1月4日&#xff0c;2019年全国大学生数学建…

每台计算机需要配置网关吗,每台计算机的IP地址和网关以及子网掩码的设置有哪些规律或者规则吗?...

满意答案hryy4082013.04.14采纳率&#xff1a;47% 等级&#xff1a;9已帮助&#xff1a;714人电脑之间要实现网络通信&#xff0c;就必须要有一个合法的ip地址。IP地址网络地址主机地址&#xff0c;(又称&#xff1a;主机号和网络号组成)ip地址的结构使我们可以在Internet上…

mysql提高吞吐量_垃圾收集:提高吞吐量

mysql提高吞吐量这篇文章的灵感来自于在内存管理术语表中碰到“ Pig in the Python ”的定义之后。 显然&#xff0c;该术语用于解释GC反复促进大对象世代相传的情况。 据推测&#xff0c;这样做的效果类似于Python吞下整个猎物&#xff0c;只是在消化过程中被固定住了。 在接…

honeyselect捏脸教程_动漫女生的脸怎么画?卡通漫画少女教学

动漫女生的脸怎么画&#xff1f;卡通漫画少女教学&#xff01;我们知道&#xff0c;人类的审美是具有时代特征的。在不同的历史时期&#xff0c;人们的审美会发生变化。举个栗子&#xff1a;“楚王好细腰&#xff0c;宫中多饿死”“燕瘦环肥”、魏晋时期的男风盛行、初唐的“肤…

手机怎么进ph_明日发布,华为鸿蒙OS2.0手机版特色功能曝光

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。声明&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系…

清华大学 张春良 计算机系,南京张春良老师小学生信息学辅导

南师大张老师信息编程师资团队小学信息学的教学如今小学生对计算机的兴趣越来越强&#xff0c;使用计算机的时间也越来越多。许多聪慧的孩子无意之间&#xff0c;为追求控制感、成功感&#xff0c;沉溺进了电脑游戏&#xff0c;令家长、教师扼腕叹息。信息学培训&#xff0c;引…

json 在后天怎么接_长相显老怎么办?以同岁的马伊琍和刘敏涛为例,解析显年轻的技巧...

短发女王马伊琍和最近上热搜的刘敏涛都是1976年出生&#xff0c;今年44岁&#xff0c;但是当两人同框时&#xff0c;即使相同的脸型和服饰&#xff0c;马伊琍显得很年轻&#xff0c;而刘敏涛却像是隔代人&#xff0c;真的好尴尬。这是什么原因呢&#xff1f;其实她们的尴尬&…

java8 streams_当Java 8 Streams API不够用时

java8 streamsJava 8与往常一样是妥协和向后兼容的版本。 JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 。 请参阅Brian Goetz关于为什么…的一些具体解释。 …Java 8默认方法中不允许“最终” …Java 8默认方法中不允许“同步” 但是今天&#…

计算机软考初级工程资料,计算机软考网络工程师复习资料及习题(一)

1、 若是serial0 is up, line protocol is up表示该端口工作正常。2、若是serial 0 is down, line protocol is down表示路由器到本地的modem之间无载波信号cd。连接串口和 modem,开启modem.看modem的发送灯td是否亮&#xff0c;td灯亮表示路由器有信号发送给modem.td灯若不亮,…

计算机硬盘瓶颈,为何你的电脑卡的飞起,看看是不是遇到存储瓶颈

原标题&#xff1a;为何你的电脑卡的飞起&#xff0c;看看是不是遇到存储瓶颈存储一直是笔记本电脑的性能瓶颈之一&#xff0c;同时还关系到电池续航时间。除了一颗性能澎湃的处理器之外&#xff0c;更多人困惑的是硬盘存储配置的选择。硬盘不仅有容量属性&#xff0c;更是影响…

JMetro版本8.6.11和11.6.11已发布

你好 JMetro的另一个版本。 这次已重新设置了2个新控件的样式&#xff0c;错误修复和其他一些小的调整。 我希望你们在这个陌生的时代都能安然无well。 继续阅读以获取详细信息。 新的ColorPicker样式 以下是新的ColorPicker样式LIGHT和DARK的动画&#xff1a; ColorPicker…

c#中overlord实例_具有Overlord的WildFly 8.1中的API管理

c#中overlord实例昨天&#xff0c;我简要介绍了霸王项目家族。 今天是时候进行试驾了。 API管理子项目两天前发布了1.0.0.Alpha1&#xff0c;并根据18个月的路线图介绍了第一组功能。 APIMan到底是什么&#xff1f; 它是一个API管理系统&#xff0c;可以嵌入到现有框架或应用程…

计算机病毒需要附着在,计算机病毒是如何传播的?

满意答案Fixedburn2019.10.24采纳率&#xff1a;53% 等级&#xff1a;8已帮助&#xff1a;7262人1、各种网络传播(1)电子邮件电子邮件是病毒通过互联网进行传播的主要媒介。病毒主要依附在邮件的附件中&#xff0c;而电子邮件本身并不产生病毒。当用户下载附件时&#xff0c…

使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

将任何实体上的版本属性保存到 AWS DynamoDB数据库&#xff0c;它仅是表示实体已修改次数的数字表示。 首次创建实体时&#xff0c;可以将其设置为1&#xff0c;然后在每次更新时递增。 好处是立竿见影的-指示实体已被修改的次数&#xff0c;可用于审核实体。 此外&#xff0…

win7计算机个性化设置,笔记本电脑windows7系统如何用好电脑个性化设置

笔记本电脑windows7系统想要用好电脑个性化设置&#xff0c;该怎么办呢&#xff0c;下面是学习啦小编收集整理的笔记本电脑windows7系统如何用好电脑个性化设置&#xff0c;希望对大家有帮助~~笔记本电脑windows7系统用好电脑个性化设置的方法右击桌面空白区域&#xff0c;在弹…

发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...

[资讯-牛车网]为了节省燃油&#xff0c;越来越多的新车搭载了自动启停功能。搭载了这项功能的汽车&#xff0c;都会随之搭配一块独立的自动启停蓄电池&#xff0c;这块电池只单独为自动启停系统工作。那么同是蓄电池&#xff0c;自动启停电池和普通蓄电池有什么区别&#xff0c…

返回内容验签失败_邮件经常失败回弹很糟心?一定要知道这几个小知识

很多人都反应每次发送邮件&#xff0c;总有一部分发生失败回弹&#xff0c;大大影响了送达率&#xff0c;非常糟心&#xff01;今天我们为大家整理了一些常见关于发送回弹状态的相关知识以及如何避免邮件回弹的注意事项。一、回弹状态的两种类型邮件发送失败时ESP(邮件供应服务…

用火狐录制脚本为空_功能测试——链接测试amp;脚本功能

链接测试对于页面链接功能&#xff0c;测试工程师需考虑其链接文字描述正确性、链接地址跳转正确性、链接触发脚本正确性、是否存在404错误等。如果是小型Web系统&#xff0c;链接较少&#xff0c;人工测试即可&#xff0c;如果被测对象包含很多链接&#xff0c;则可利用Xenu链…