3

我需要将字段添加到 JDK 类中。例如 java.lang.String

首先我试过:

declare parents: ( * && !java.lang.Object ) implements VistaInt;
public String[] VistaInt.abc;

然而这不起作用。

它会发出警告

this affected type is not exposed to the weaver:
org.aspectj.lang.Signature [Xlint:typeNotExposedToWeaver]

所以我在互联网上对其进行了研究,发现它似乎更难,而且 AspectJ 不支持直接插入 JDK 类在这里说:

http://www.inf.usi.ch/faculty/binder/documents/pppj08.pdf

但是有人提出了一些叫做 FERRARI 框架的东西,它是 AspectJ 的工具,应该允许注入 JDK 类。

所以我一直在寻找它并到达这里:

http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg02520.html

但是这些链接都不起作用,我找不到任何其他来源、工具或任何可以帮助我的东西。

你有什么想法,在哪里可以找到这个库,或者如何注入 java JDK 类型?

谢谢!

4

1 回答 1

5

首先,您需要找到 Eclipse 项目正在使用的 rt.jar。这很可能是您机器的默认设置,但要检查您可以右键单击项目中的 JRE 系统库图标,单击属性和已安装的 JRE。rt.jar 文件位于 lib 下。

一旦你有了它,你需要从命令行编织它(你可能需要下载单独的 ajc 编译器)。假设你想编织 MyAspect.aj 你会运行

ajc -inpath rt.jar MyAspect.aj -outjar newrt.jar

然后,您需要通过将 newrt.jar 放在 rt.jar 之前的引导类路径中来确保您的代码使用此库。从命令行运行你这样做

java -Xbootclasspath/<path to newrt.jar> MyApplication

在 Eclsipse 中,您添加-Xbootclasspath/<path to newrt.jar>到运行配置。

但是,我不建议修改java.lang.String,因为 JVM 通常会特别对待此类。但如果你愿意,你可以试一试:)

笔记

我相信您提到的 FERRARI 框架是针对 LTW(加载时间编织)的,而这个讨论是针对 CTW(编译时间编织)解决方案的。如果您想做 LTW,那么您将遇到困难,因为自定义类加载器无法加载java.*类,因此您无法在加载时编织它们。您的链接表明人们已经尝试过解决方法,但我对此一无所知。

于 2013-07-05T09:02:04.230 回答