标签: aspectj

具有带注释参数的切入点匹配方法

在以下情况下,我需要使用与方法匹配的切入点创建方面:

  1. 它是用MyAnnotationForMethod注释的
  2. 其中一个参数(可以有很多)用@MyAnnotationForParam注释(但也可以有其他注释).

方面类看起来像这样

@Pointcut("execution(@MyAnnotationForMethod * *(..,@aspects.MyAnnotationForParam Object, ..)) && args(obj)")
void myPointcut(JoinPoint thisJoinPoint, Object obj) {
}

@Before("myPointcut(thisJoinPoint ,  obj)")
public void doStuffOnParam(JoinPoint thisJoinPoint, Object obj) {
    LOGGER.info("doStuffOnParam :"+obj);
}
Run Code Online (Sandbox Code Playgroud)

注释方法

@MyAnnotationForMethod
public string theMethod(String a, @MyAnnotationForParam @OtherAnnotation Object obj, Object b){ 
    LOGGER.info(a+obj+b);
}
Run Code Online (Sandbox Code Playgroud)

用eclipse - >警告:关于poincut:

Multiple markers at this line 
    - no match for this type name: MyAnnotationForMethod [Xlint:invalidAbsoluteTypeName] 
    - no match for this type name: aspects.MyAnnotationForParam On the before : advice defined in xxx.xxx.xxx.xxx.MyAspect has not …
Run Code Online (Sandbox Code Playgroud)

java parameters aop annotations aspectj

8
推荐指数
1
解决办法
9265
查看次数

如何在AspectJ中的AfterThrowing中吞下异常

在AspectJ中,我想吞下一个异常.

@Aspect
public class TestAspect {

 @Pointcut("execution(public * *Throwable(..))")
 void throwableMethod() {}

 @AfterThrowing(pointcut = "throwableMethod()", throwing = "e")
 public void swallowThrowable(Throwable e) throws Exception {
  logger.debug(e.toString());
 }
}

public class TestClass {

 public void testThrowable() {
  throw new Exception();
 }
}
Run Code Online (Sandbox Code Playgroud)

上面,它没有吞下异常.testThrowable()的调用者仍然收到异常.我希望来电者不要收到例外.怎么办呢?谢谢.

java aspectj

8
推荐指数
2
解决办法
4497
查看次数

Spring aspectj jar未正确配置

当我尝试使用Roo创建的JPA对象时,我收到此错误.

实体管理器尚未注入(Spring Aspects JAR是否配置为AJC/AJDT方面库?)

我已经按照一些在线建议将spring-aspects.jar添加到Eclipse中的aspectj路径,但我仍然遇到此错误.有谁知道如何解决这个问题?

我使用的环境是Spring 3.0.5,Hibernate 3.6和JBoss 6.0.0.Final.

spring aspectj spring-roo

8
推荐指数
1
解决办法
6952
查看次数

AspectJ编译器(ajc)vs加载时编织

这里有几个问题:

  • ajc是否会更改它编译的所有类(甚至是非方面的类)?如果我只编写方面类ant然后将它们放在与常见类相同的类路径中,该怎么办?

  • ajc编译的项目是否比使用加载时编织的项目执行得更快?

  • 如果我需要编写一个跟踪AspectJ的库,然后我希望这个库可以用于任何项目,该怎么办?在这种情况下,加载时编织是唯一的选择吗?

aspectj

8
推荐指数
1
解决办法
6534
查看次数

NoSuchMethodError aspectOf()在运行时从使用iajc构建

我们使用aspectJ来获取现有应用程序的一些指标.在eclipse中使用AJDT进行构建和编织时,一切都很有效.但在整合环境中.我们使用ant脚本来构建和部署应用程序.

问题发生在ExceptionHandler上我确实我们的方面不会抛出异常并破坏应用程序

@Aspect
public class ExceptionHandlerAspect {

    /**
     * Pointcut
     */
    @Pointcut("within(com.xxx.yyy.aop.aspect.*..*)")
    public void allMethodInAspectPackage() {}

    /**
     *  Pointcut
     */
    @Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)")
    public void notInExceptionHandlerAspectClass() {}
    /**
     *  Pointcut
     */
    @Pointcut("call(* *(..))")
    public void allClassAndMethod() {}

    /**
    @Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()")
    public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{
        Object ret = null;
        try {
            ret = joinPoint.proceed();
        }catch (Throwable exception) {
            if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) {
                throw exception;
            }
            this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception);
        }finally {
            return ret; 
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

基本上,我想拦截我的方面包中的每个调用,除了在ExceptionHandler本身.

ant …

aspectj

8
推荐指数
1
解决办法
9117
查看次数

如何使用带注释的参数将参数传递给Spring AOP建议?

我正在使用Spring 3.1.2.RELEASE和cglib加载时编织,我正在尝试使用具有自定义注释和注释参数的方法.

建议:

@Aspect
public class MyAdvice
{
   @Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
   "&& args(batch) && @args(propertyToLock)"
   public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch, LockVal propertyToLock) throws Throwable { 
        //Do stuff.... 
        pjp.proceed();
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的类:

public interface UpdateManager
{
   public void processUpdate(MyBatchObject batch);
}


public class UpdateManagerImpl implements UpdateManager
{
   @Lock
   public void processUpdate(@LockVal("lockValue") MyBatchObject batch)
   {
      //Do stuff...
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我无法获得执行建议.如果我删除了切入点中的@args和args条件,那么建议就会触发,但是我必须通过ProceedingJoinPoint来获取我需要的参数.

为什么不提出建议?我做错什么了吗?

编辑:以下切入点作为Spring的独立程序工作:

@Aspect
public class MyAdvice
{
   @Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
   "&& args(batch)"
   public Object …
Run Code Online (Sandbox Code Playgroud)

aop spring aspectj

8
推荐指数
1
解决办法
3万
查看次数

为aspectj运行JDK8

我正在尝试使用JDK8运行aspectj-maven插件.但它给出的错误如"java.lang.CharSequence类型无法解析.它是从所需的.class文件间接引用的"

有关如何解决的任何帮助,或者aspectj-maven-plugin是否支持JDK8.我正在使用1.6版本的aspectj - maven-plugin.

java aspectj maven-plugin maven

8
推荐指数
1
解决办法
9455
查看次数

使用AspectJ的Spring AOP:加载时间编织

如果我使用的是基于AspectJ的Spring AOP,那么我是否可以配置我的方面以使用加载时间编织?或者,当使用基于AspectJ的方法时,Spring AOP是否也支持运行时/编译时编织?

aop spring aspectj load-time-weaving

8
推荐指数
2
解决办法
2万
查看次数

运行AspectJ会导致NoSuchMethodError:Aspect.aspectOf

我有一个非常简单的AspectJ方面(使用@AspectJ),它只打印出一条日志消息.我的目标是在我的Android应用程序中建议代码.现在,只要我在应用程序源代码中拥有aspect类本身,这个方面就可以完美地运行.一旦我将方面移动到另一个模块(java - > .jar或android lib - > .aar),我在应用程序中运行建议代码时会遇到以下运行时异常:

java.lang.NoSuchMethodError: com.xxx.xxx.TraceAspect.aspectOf
Run Code Online (Sandbox Code Playgroud)

基本上我的结构是这样的:

Root
 + app (com.android.application)
   - MainActivity (with annotation to be adviced)
 + library (android-library)
   - TraceAspect (aspect definition)
Run Code Online (Sandbox Code Playgroud)

从ajc编译器,我可以看到ajc编译器选择了我的类并正确地建议它们,所以我真的不知道为什么它可以工作,只要我在源代码中有@AspectJ类,但是一旦我移动就停止工作它是一个jar存档.

我正在使用gradle.我的应用程序的Buildscript非常简单.我按照http://fernandocejas.com/2014/08/03/aspect-oriented-programming-in-android/中的说明进行操作

import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.12.+'
    classpath 'org.aspectj:aspectjtools:1.8.1'
  }
}

apply plugin: 'com.android.application'

repositories {
  mavenCentral()
}

dependencies {
  compile 'org.aspectj:aspectjrt:1.8.1'
  compile project (':library')
}


android.applicationVariants.all { variant ->
    AppPlugin plugin …
Run Code Online (Sandbox Code Playgroud)

java android aspectj gradle android-gradle-plugin

8
推荐指数
3
解决办法
8667
查看次数

AspectJ:如何将方面库编织到Java项目中

我使用AspectJ构建小型库(Java和Maven).图书馆必须是独立的.图书馆提供方面和注释.库的功能是 - "执行具有特定注释的方法时调用建议".当我在一个模块中使用所有内容时,一切正常,但是当我将库和项目与必须应用建议的类分开时,问题就会出现.我创建简单的架构. 架构 图书馆B - 我的图书馆(方面和注释)项目A - 项目必须适用的商业方法是否有可能做到这一点?

java aop aspectj maven

8
推荐指数
1
解决办法
3964
查看次数