Java:跟踪动态加载类的执行

时间:2010-06-21 11:00:58

标签: java annotations

基本上我要做的是用动态加载带有注释方法的类,运行类的main方法,然后在调用带注释的方法时触发一些代码。

例如:

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

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

traceHandler.java程序应该能够加载任何类,运行其main方法并在调用带注释的X方法时打印“方法X调用”。 我做了动态加载部分,但我找不到在注释方法上“放置列表”的方法。

我发现的解决方案涉及使用AOP或使用代理通过使目标类实现一些接口(1) 有没有其他方法可以动态地完成整个事情而无需深入了解目标类的细节?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在我所知的情况下,使用动态代理是一种最简单的方法,可以通过注释“丰富”类的行为而无需借助于工具或第三方框架。

InvocationHandler可以是完全通用的,但它不需要知道目标类。你link中的例子有

private final Login realLogin;

但很可能被

取代
private final Object realLogin;

因为调用发生在return method.invoke(realLogin, args);

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

答案 2 :(得分:0)

创建动态代理不需要您详细了解目标类,因为您需要的所有信息都会在调用invoke()时传递。

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

我对目标类没有实现接口的问题有点困惑。如果你要动态加载它们,它们需要以某种方式适应更大的图像,我总是假设有一些界面能够操纵它们。