AspectJ能否向java.lang.String添加方法?

6

我已经阅读了一些关于AspectJ的文章,我知道它可以增强类,这很吸引人。但我有一个非常愚蠢的问题,找不到明确的答案:

AspectJ能够给java.lang.String添加方法吗?

或者类似的问题:如果我无法获取某些类的源代码,我能否通过AspectJ来增强它们?

3个回答

8

我本来在查找其他内容时偶然发现了这个问题。我想指出,即使Kowser的答案已经被接受,但有些不正确。问题中没有限制使用LTW,所以CTW仍然可以使用。可以编织JDK/JRE类文件,然后在稍后的步骤中将建议的类添加到启动类路径的前面。我以前就这样做过(甚至实现了问题中所要求的,即在String中声明一个新方法),而且它可以顺利工作。


6

很抱歉,我的朋友,你不能这样做。

我认为这就是你要找的用户无法访问的类型

如需更多详细信息,请参阅AspectJ开发环境指南#特殊情况

正如它所说:

以下类不会暴露给LTW基础架构,无论使用哪个aop.xml文件

  • 所有org.aspectj.*类(和子包)-因为这些是基础架构本身所需的
  • 所有java.*和javax.*类(和子包)
  • 所有sun.reflect.*类-因为这些是在反射调用发生时使用的JDK特定类

此答案仅适用于LTW。 - selig

4
我并不是AspectJ的专家,但我相信你可以同时做到这两件事情。
要向一个类添加方法,甚至让它实现一个新接口并通过方面提供实现,我认为你需要使用inter-type declarations
AspectJ通过字节码操作来完成其工作,因此您不需要访问正在更改的类的源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接