2015-10-11 100 views
1

我想在运行时执行方法之前运行一些代码,并且我想使用注释来实现它。我有一个注释@SetValues在执行方法之前使用注释执行代码

@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD }) 
public @interface SetValues 
{} 

我是新来的注释,并有几个问题

  1. 我怎么能有一些代码,当这个附加注释的方法
  2. 正在执行我怎么能在执行方法之前是否有与注解运行相关的代码?
+0

定义“执行方法之前”。在编译时,在运行时?你也知道在执行代码的时候添加一个注释本身绝对不会做任何事情吗?只有通过反射在注释类上看起来的代码(你必须写)可以对它们做些事情。也许这就是你的意思:https://en.wikipedia.org/wiki/AspectJ – zapl

+0

@zapl,是的,我想添加代码,但不知道如何做到这一点。还应该怎么做才能在运行时执行方法之前执行它 – user3330263

回答

0

有几种方法可以做到这一点:

  1. 面向方面的编程已经提到,AspectJ是这里的标准。
  2. 你可以自己写一段代码来做类似的事情。在这种情况下,您可能想要在代理中包含所有(只有一些?)具有这些注释方法的接口对象(查看java.lang.reflect.proxy),该方法在调用方法本身之前执行您想要的代码(查看java.lang.reflect.InvocationHandler )。将此与Method.getDeclaredAnnotations()结合在一起,你可以构建你想要的东西。

但我不太清楚,以你到底是什么你想要的。名称“SetValues”似乎意味着你想改变某些字段的值(也许在执行方法后恢复它们)。你必须认识到InvocationHandler只能做很多事情。它不能也不应该打破封装例如(至少在任何其他代码片段都可以在反射的帮助下完成)。 另一个需要考虑的特性是,当InvocationHandler尝试更改这两个方法所需的值时,它可能会与此类方法的并发执行非常不好地交互。

相关问题