1

我试图劫持/拦截 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 回答 2

2
  1. 基本上语法看起来不错,但我没有尝试从您的代码片段中复制完整的方面。此外,我只使用原生 AspectJ 语法,对基于注解的语法不太熟悉,所以如果出现问题,我可能没有看到。

  2. 不可以,但是如果您想编织一个由您的主应用程序使用的库(JAR 或解压缩到文件系统中),您必须确保它位于编织器的路径中。有关语法,请参阅 AspectJ 文档。编辑:我今天早些时候在另一个答案中发布了一些有用的链接。

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

    更新:对于使用 AspectJ 一段时间的人来说,另一个提示有时似乎太简单了:不要使用execution需要编织目标类的call切入点,您可以只使用拦截(顾名思义)调用的切入点到您的客户类中的任何地方的目标。它的效率可能会稍低一些,但可能是您最好和最简单的选择,除非您真的想不厌其烦地编写 JDK。

于 2012-08-22T11:19:41.467 回答
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

于 2016-12-27T17:24:09.327 回答