如何从第三方(EclipseLink)jar甚至JDK中劫持/拦截类的方法?

时间:2012-08-22 01:28:20

标签: spring aop aspectj

我尝试在EclipseLink中劫持/拦截类的方法。我曾尝试过Spring AOP和AspectJ,但我失败了。我希望在调用方法org.eclipse.persistence.internal.localization.i18n.TraceLocalizationResource时类getString(..);抛出异常时执行某些操作我的实现如下:

@AfterThrowing(pointcut = "execution(* org.eclipse.persistence.internal.localization.i18n.TraceLocalizationResource.getString(..))",throwing="error")
    public void logAfterThrowing(JoinPoint joinPoint,Throwable error) {
....
}

calss TraceLocalizationResource被调用(我调试它)。但是没有调用劫持方法。

我的问题:

  1. 我是以错误的方式做的吗?
  2. 我们想要劫持或拦截的目标类必须是自定义类型吗?
  3. 如果我想在JDK中劫持类,如java.lang.String?
  4. ,该怎么办?

2 个答案:

答案 0 :(得分:2)

  1. 基本上语法看起来没问题,但我没有尝试复制过 来自您的代码段的完整方面。而且,我只使用 原生的AspectJ语法并不是很熟悉 基于注释的语法,所以如果有问题,我可能不会 已经看过了。

  2. 不,但如果您要编写主应用程序使用的库(JAR或解压缩到文件系统中),则必须确保它位于编织器的路径中。有关语法,请参阅AspectJ文档。 修改:我今天早些时候在another answer发布了一些有用的链接。

  3. 默认情况下,包裹org.aspectjjavajavax会被排除在编织之外。对于后两者,有命令行开关来启用编织。但LTW充其量是棘手的,最糟糕的是a **(几乎不可能),因为你有一个鸡蛋问题:AspectJ weaver运行时类需要JDK,而JDK bootstrapping在任何Java之前发生像织工一样的代理人。因此,最好的办法是编译JDK类的编译时间,然后在应用程序中使用编织的rt.jar。即使使用编译时编织,如果您的建议本身使用JDK编织类,也可能会遇到问题。你想确保避免那里的无限递归。但这是有可能的。

    更新:对于已经使用AspectJ一段时间的人来说,有时候似乎太容易提及的另一个提示:而不是execution切入点,这使得编织目标类成为必要,你可以使用一个call切入点来拦截(顾名思义)你的客户端类中到处目标的调用。它可能效率稍低,但也许是你最好和最简单的赌注,除非你真的想要编织JDK。

答案 1 :(得分:2)

可以编织第三方库,但您必须配置aspectj-maven-plugin插件:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.9</version>
    </dependency>

     <dependency>
      <groupId>org.agroup</groupId>
      <artifactId>to-weave</artifactId>
      <version>1.0</version>
    </dependency>

    <dependency>
      <groupId>org.anothergroup</groupId>
      <artifactId>gen</artifactId>
      <version>1.0</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.9</version>
        <configuration>
          <weaveDependencies>
            <weaveDependency>
              <groupId>org.agroup</groupId>
              <artifactId>to-weave</artifactId>
            </weaveDependency>
            <weaveDependency>
              <groupId>org.anothergroup</groupId>
              <artifactId>gen</artifactId>
            </weaveDependency>
          </weaveDependencies>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

来源:http://www.mojohaus.org/aspectj-maven-plugin/examples/weaveJars.html