【发布时间】:2012-09-02 18:38:05
【问题描述】:
我正在为服务开发一个插件。为了使其发挥作用,它需要一些服务不提供的数据。
插件具有严格的加载/卸载规范。一个裸插件如下所示:
public class Plugin extends JavaPlugin
{
@Override
public void onEnable() {} //Plugin enters here. Comparable to main(String[] args)
@Override
public void onDisable() {} //Plugin exits here, when service shuts down.
}
有一个名为 org.service.aClass 的包。里面有一个Method。 aMethod 看起来像这样:
public boolean aMethod(boolean bool) {
return bool;
}
一个过于简单的场景,但它确实有效。 每当调用 aMethod 时,我的插件都需要知道 bool 的值。这对我的程序绝对至关重要;我没有其他方法可以获得该值。
我会建议 aMethod,但由于我的插件是在服务之后加载的,所以这不起作用。据我了解,加载时间编织也不适合这里,因为是在之后加载的。
尽管它不起作用,这是我正在使用的方面,以防它可能有用:
public aspect LogAspect {
pointcut publicMethodExecuted(): execution(* org.service.aClass.aMethod(..));
after(): publicMethodExecuted(){
cat(String.format("Entered method: %s.",
thisJoinPoint.getSignature()));
List<Object> arguments = Arrays.asList(thisJoinPoint.getArgs());
List<Object> argTypes = new ArrayList<Object>();
for (Object o: arguments) {
argTypes.add(o.getClass().toString());
}
cat(String.format("With argument types: %s and values: %s.",
argTypes, arguments));
cat(String.format("Exited method: %s.", thisJoinPoint.getSignature()));
}
public void cat(Object dog) {
System.out.println("[TEST] " + dog);
}
}
我现在打开了 AspectJ: In Action 书籍,在所有加载时编织示例中,它都提到程序必须以 -javaagent 标志启动。由于我的 proram 是一个插件,所以不可能发生这种情况。
我还研究了 ASM。我找到了一个关于构建分析器的精彩教程(基本上是我想做的)here。
问题是它在启动时再次使用了 -javaagent 标志,以及公共静态 premain,所以它不适合,因为我只有 onEnable 和 onDisable。
然后我发现了Java的Attach API。从外观上看,这将允许我在加载类之后附加我的代理,即探查器。看起来很完美,但经过半小时的搜索,我找不到一个我能理解的好例子。
有人可以帮忙吗?这是一个二合一的问题:AspectJ 可以用于此目的吗?如果是这样,怎么办?另外,如果它不能,有人可以指出我使用带有 ASM 分析器的 Attach API 的正确方向吗?
提前致谢!
【问题讨论】:
-
为什么不能在插件加载之前编织服务? (我假设你控制整个 jvm,因为你表明你可以控制服务 jar)。
-
@jtahlborn 服务本身就是这样运行的。 Loader 读取一个 yml 文件,指定要加载的服务。我正在做的是创建服务的副本,更改我需要的类,然后修改 yml 文件以指向我的新服务。在我的改装服务启动时,我删除了原版服务。我的插件由服务加载,服务加载后。
-
也许我只是不明白你的评论,但我看不出为什么 LTW 不适合你。它是为您想要做的事情而发明的:在加载类时编织类 - 因此名称为 LTW。
-
stackoverflow.com/questions/11749409/… 似乎相关:一个插件试图修改加载它的应用程序。那里(还)没有 AspectJ,但也许这两个问题可以相互受益。
-
@kriegaex 如果我在加载文件之前无法访问文件,那么加载时编织是否有效?我正在阅读 AspectJ: In Action 及其加载时间编织的所有示例都使用 -javaagent 执行程序...
标签: java aspectj profiler trace