java – 使用注释修改方法
|
如何在 Java中更改方法正在做什么? 我的意思是,我试图使用注释来做以下代码 @Anno1(Argument = "Option1")
public class TestClass
{
@Anno2
public void test()
{
}
}
成 public class TestClass
{
private static StaticReference z;
public void test()
{
z.invokeToAll();
}
}
这是一个非常简单的例子,我正在努力做. Anno1将有很多可能的组合,但这不是我的问题.我的问题是如何添加代码到方法test() 如果可能,我正在寻找一个更通用的解决方案.例如.一种在方法中添加各种代码的方法(不仅仅是一种方式.invokeToAll()) 到目前为止,我使用import javax.annotation.processing.*;我有以下代码,但我不知道如何从那里继续 private void processMethodAnnotations(RoundEnvironment env)
{
for (Element e : env.getElementsAnnotatedWith(Anno2.class))
{
//If it is a valid annotation over a method
if (e.getKind() == ElementKind.METHOD)
{
//What to do here :S
}else
{
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,"Not a method!",e);
}
}
}
我发现了一些有关Java反思的内容,但是我没有找到任何来源来帮助我. 显然我在我的代码中扩展了AbstractProcessor 我已经找到这个教程(http://www.zdnetasia.com/writing-and-processing-custom-annotations-part-3-39362483.htm)但是这关系到创建一个新的类,而不仅仅是改变一个方法.而javax.lang.model.elements不提供任何编辑该元素的方式(在我的例子中代表一个方法). 我希望我的问题是明确的,符合规则.如果没有,请评论,我会澄清.谢谢. 解决方法注释处理是错误的方法,从 Wikipedia:
人们建议你正确的方法 – AOP.具体可以使用AspectJ. “快速结果”的方式是(如果使用Eclipse): 1)安装AJDT(AspectJ开发工具) public aspect Processor {
private StaticReference z;
pointcut generic()
// intercept execution of method named test,annotated with @Anno1
// from any class type,annotated with @Anno2
: execution(@Anno2 * (@Anno1 *).test())
// method takes no arguments
&& args ();
// here you have write what you want method actually does
void around () : generic() {
z.invokeToAll();
}
}
现在你可以执行测试,你会看到它的工作原理;)AJDT自动编译代码,所以不需要任何手工工作,希望这就是你所说的“魔术”;) 更新: 如果你在test()方法中的代码取决于Anno1注释值,那么在内部方面你可以通过这种方式获得它执行的类注释: void around () : generic() {
Annotation[] classAnnotations = thisJoinPoint.getThis().getClass().getAnnotations();
String ArgumentValue = null;
for ( Annotation annotation : classAnnotations ) {
if ( annotation instanceof Anno1 ) {
ArgumentValue = ((Anno1) annotation).Argument();
break;
}
}
if ( ArgumentValue != null && ArgumentValue.equals("Option1")) {
z.invokeToAll();
}
}
其中thisJoinPoint是一个特殊的参考变量. UPDATE2: 如果要在您的方面添加System.out.println(this),则需要在其中写入System.out.println(thisJoinPoint.getThis()),刚刚测试并可以正常工作. thisJoinPoint.getThis()返回你“这个”但不完全;实际上这是Object变量,如果你想获得任何属性,你需要投射或使用反射.而这个JoinPoint.getThis()不提供对私有属性的访问. 嗯,现在好像你的问题已经回答了,但是如果我错过任何东西,或者你以这种方式获得更多的问题/问题,请随时问;) (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
