我需要通过使用注释作为切入点来接受一些方法及其属性,但是如何访问这些方法属性.我有以下代码,可以在方法运行之前成功运行代码,但我只是不知道如何访问这些attrbiutes.
package my.package;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut(value="execution(public * *(..))")
public void anyPublicMethod() {
}
@Around("anyPublicMethod() && @annotation(myAnnotation )")
public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
throws Throwable {
// how can I access method attributes here ?
System.out.println("hello aspect!");
return pjp.proceed();
}
}
Run Code Online (Sandbox Code Playgroud) 在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()的调用者仍然收到异常.我希望来电者不要收到例外.怎么办呢?谢谢.
我们使用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 …
我正在创建一个带有spring aspectj的方面类,如下所示
@Aspect
public class AspectDemo {
@Pointcut("execution(* abc.execute(..))")
public void executeMethods() { }
@Around("executeMethods()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("Going to call the method.");
Object output = pjp.proceed();
System.out.println("Method execution completed.");
return output;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想访问类abc的属性名称然后如何在方面类中访问它?我想在profile方法中显示abc类的name属性
我的abc课程如下
public class abc{
String name;
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
public void execute(){
System.out.println("i am executing");
}
}
Run Code Online (Sandbox Code Playgroud)
如何访问方面类中的名称?
我正在使用Spring <aop:aspectj-autoproxy />来代理一些JPA存储库接口.
但是,代理失败的情况如下Cannot subclass final class class $Proxy80:
无法生成类[class $ Proxy80]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类; 嵌套异常是java.lang.IllegalArgumentException:不能继承最终类class $ Proxy80
由于错误和快速谷歌建议 - 当代理目标是最终类时会发生这种情况.但是,在这个链中,没有类 - 只有接口.Spring在运行时生成所有实现.
这是失败的接口的定义:
public interface AuthorDAO extends
CrossStoreJpaRepository<Author,Long>, CrossStoreQueryDslPredicateExecutor<Author> {
}
Run Code Online (Sandbox Code Playgroud)
注意我正在使用spring的JpaRepository和QueryDslPredicateExecutor的自定义子类,定义如下:
public interface CrossStoreJpaRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {}
public interface CrossStoreQueryDslPredicateExecutor<T> extends QueryDslPredicateExecutor<T>{}
Run Code Online (Sandbox Code Playgroud)
在其他地方,我在这些接口上定义方法的自定义方面:
@Aspect
@Component
public class DocumentLoadingAspect extends AbstractDocumentAspect {
@Around("execution(* com.mangofactory.crossstore.repository.CrossStore*.find*(..))")
public Object loadCrossStoreEntity(ProceedingJoinPoint pjp) throws Throwable
{
// implementation omitted
}
Run Code Online (Sandbox Code Playgroud)
我已经确认这些@Aspect定义是通过删除它们并重新运行应用程序而导致问题的.
导致此错误的原因是什么?似乎代理代理由于某种原因失败了.
我试图在编译时将一些方面编织成一个成为WAR的项目.这些方面建议在同一个项目中的类(尽管在不同的包中).
我收到警告:
Advice not applied
Run Code Online (Sandbox Code Playgroud)
我的方面没有被执行.这是我的设置:
注释FooAnnotation.java:
package a;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FooAnnotation {}
Run Code Online (Sandbox Code Playgroud)
方面FooAdvice.aj:
package a;
public aspect FooAdvice {
private static final Log log = LogFactory.getLog(FooAdvice.class);
Object around() : call( @FooAnnotation * *(..)) {
log.info(String.format("Testing around"));
return proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过了注释:
@Around("call( @FooAnnotation * *(..))")
public Object checkFoo( ProceedingJoinPoint joinPoint) throws Throwable {
Run Code Online (Sandbox Code Playgroud)
据我所知,我的切入点规范是正确的,但由于某种原因,ajc编译器没有打球.
类FooClass.java:
package b;
@ApplicationPath("/service")
@Path("/{param}")
@Produces("application/json")
@Provider
public class FooClass {
@POST
@PUT
@Path("/{context}/{resource}")
@FooAnnotation
public String updateResource(...) {}
Run Code Online (Sandbox Code Playgroud)
pom.xml中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …Run Code Online (Sandbox Code Playgroud) 有没有人成功使用Android Studio设置MonkeyTalk?
我在这一点上的主要问题是我没有看到将java编译器设置为aspectj的方法
我相信在custom_rules.xml中有一些方法可以做到这一点,但我还没有看到如何做到这一点.
这导致了一个可能无关的问题,但在我使用的最新版Android Studio(0.1.1)中,我没有看到从Android Studio内部运行ant构建的方法.
任何建议赞赏!
我正在研究Spring AOP,我有以下疑问.
据我所知,有两种方法可以将AOP行为实现到Java应用程序中:
AspectJ:这是第一个使用字节码修改进行方面编织的原始AOP技术.
Spring AOP:基于Java的AOP框架,使用AspectJ集成,使用动态代理进行方面编织.
我的疑问是:究竟什么意味着Spring AOP是一个带有AspectJ集成的AOP框架?那么它依次使用AspectJ?或者是什么?
第二个疑问与Spring AOP的Spring配置有关,我知道我可以这样做:
1)使用Java配置类:
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages=“com.example”)
public class AspectConfig {
...
}
Run Code Online (Sandbox Code Playgroud)
2)使用XML:
<beans>
<aop:aspectj-autoproxy />
<context:component-scan base-package=“com.example” />
</beans>
Run Code Online (Sandbox Code Playgroud)
因此,在两种配置中,Spring AOP似乎都使用AspectJ,因为在这些配置中我有:@EnableAspectJAutoProxy和
它究竟意味着什么?
我使用 Spring Boot 2.1.6.RELEASE 在 Spring 中创建了一个简单的方面。它基本上记录了在方法上花费的总时间。
@Aspect
@Component
public class TimeLoggerAspect {
private static final Logger log = LoggerFactory.getLogger(TimeLoggerAspect.class);
@Around("@annotation(demo.TimeLogger)")
public Object methodTimeLogger(ProceedingJoinPoint joinPoint)
throws Throwable {
long startTime = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long totalTime = System.currentTimeMillis() - startTime;
log.info("Method " + joinPoint.getSignature() + ": " + totalTime + "ms");
return proceed;
}
}
Run Code Online (Sandbox Code Playgroud)
方面由TimeLogger注释触发
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeLogger {
}
Run Code Online (Sandbox Code Playgroud)
并在这样的组件中使用
@Component
public class DemoComponent {
@TimeLogger
public void sayHello() {
System.out.println("hello");
} …Run Code Online (Sandbox Code Playgroud) 我想在我的 IntelliJ Idea 中启用 AspectJ 编译器,因为我想在编译时编织几个方面。
同时,我在我的代码库中使用 Lombok 和 Mapstruct。
这两个需要额外的注释处理,这必须在ajc开始之前发生。我为 Lombok 和 Mapstruct 安装了两个插件。它们独立工作正常,正在生成源代码。但是当我启用ajc并勾选Enable annotation processing options,然后构建一个项目时,我得到:
Error:(9, 0) ajc: Internal error in the mapping processor: java.lang.NullPointerException at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding.sourceField(FieldBinding.java:425) at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.determineSourceStart(TypeElementImpl.java:108) at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.getSourceStart(TypeElementImpl.java:72) at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:65) at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl$SourceLocationComparator.compare(TypeElementImpl.java:1) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:360) at java.util.TimSort.sort(TimSort.java:234) at java.util.Arrays.sort(Arrays.java:1512) at java.util.ArrayList.sort(ArrayList.java:1462) at java.util.Collections.sort(Collections.java:175) at org.aspectj.org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.getEnclosedElements(TypeElementImpl.java:166) at org.mapstruct.ap.internal.util.workarounds.SpecificCompilerWorkarounds.replaceTypeElementIfNecessary(SpecificCompilerWorkarounds.java:99) at org.mapstruct.ap.internal.util.Executables.getAllEnclosedExecutableElements(Executables.java:99) at org.mapstruct.ap.internal.model.common.Type.getAllMethods(Type.java:633) at org.mapstruct.ap.internal.model.common.Type.getPropertyReadAccessors(Type.java:496) at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:168) at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:376) at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:151) at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:122) at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:76) at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:283) at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:263) at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:221) …Run Code Online (Sandbox Code Playgroud) aspectj ×10
java ×7
aop ×3
spring ×3
spring-aop ×3
android ×1
ant ×1
java-ee ×1
jax-rs ×1
mapstruct ×1
maven ×1
monkeytalk ×1
spring-boot ×1