AspectJ - 编译时 - 在JDK类中编织类型

时间:2013-07-04 16:52:25

标签: aop java aspectj code-injection

我需要在JDK Classes中添加字段。例如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

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

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分: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之前的bootclasspath中。从命令行运行

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

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

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

注意

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