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类型?
谢谢!
首先,您需要找到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.*类,因此你无法在加载时编织这些类.您的链接表明人们尝试过一种解决方法,但我对此一无所知.