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

Mar*_*nek 3 java aop aspectj code-injection

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

首先我试过:

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

然而,这不起作用.

它会发出警告

this affected type is not exposed to the weaver:
org.aspectj.lang.Signature [Xlint:typeNotExposedToWeaver]
Run Code Online (Sandbox Code Playgroud)

所以我在互联网上进行了研究,发现它看起来更难,并且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类型?

谢谢!

sel*_*lig 5

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

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

ajc -inpath rt.jar MyAspect.aj -outjar newrt.jar
Run Code Online (Sandbox Code Playgroud)

然后,您需要确保代码使用此库,方法是将newrt.jar放在rt.jar之前的bootclasspath中.从命令行运行即可执行此操作

java -Xbootclasspath/<path to newrt.jar> MyApplication
Run Code Online (Sandbox Code Playgroud)

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

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

注意

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

  • 实际上,我在编织JDK类时通常要做的就是创建一个编织JDK类的小JAR而不是一个大的JAR,然后将这个JAR添加到引导类路径中,从而遮蔽原始类.这是一种微创. (2认同)