2010-06-21 70 views
2

基本上我要做的是动态加载带注释方法的类,运行该类的主要方法,然后在调用带注释的方法时触发一些代码。Java:动态加载类的跟踪执行

例:

public myclass { 
public static void myMethod1(){ 
mymethod2(); 
} 

@trace 
public static void myMethod2(){ 
    ... some code here ... 
} 
public static void main(String[] args) { 
mymethod1(); 
} 
} 

的traceHandler.java程序应该能够加载任何类,运行它的主要方法和打印“方法X称为”当一个带注释X方法被调用。 我做了动态加载的一部分,但我找不到一种方法来“注释列表”方法的注释。

我发现涉及使用AOP或使用代理服务器通过使目标类实现某些接口(1) 是否有任何其他的方式做这件事动态并不进入目标类的细节的解决方案?

回答

2

您可以使用AspectJ来跟踪方法调用。创建切入点以定位用@trace注释标注的方法,并创建连接点以捕获这些方法的执行。然后,您可以编写建议,在该建议中可以将方法调用记录到sysout或日志文件。有关示例,请参见this博客文章。

0

创建一个动态代理并不需要你进入目标类的细节,因为你需要的所有信息都在调用invoke()中传递。

结账http://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.html它并不像听起来那么可怕。

我对目标类没有实现接口的问题有些困惑。如果您要动态加载它们,它们需要以某种方式适合更大的图片,并且我始终认为有一些界面可以操纵它们。

1

对我而言,使用动态代理是最简单的方法,可以在不借助工具或第三方框架的情况下“丰富”带有注释的类的行为。

虽然InvocationHandler可以是完全通用的,但它不需要知道目标类。在您的例子link

private final Login realLogin; 

但可能深受

private final Object realLogin; 

因为调用与return method.invoke(realLogin, args);发生更换。

请注意,您将无法将此技术与static方法一起使用,就像在您的问题中一样。该技术确实只适用于实例方法,并且该对象实现了接口。