Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置aspectj忽略getter和setter_Java_Aop_Aspectj - Fatal编程技术网

Java 如何配置aspectj忽略getter和setter

Java 如何配置aspectj忽略getter和setter,java,aop,aspectj,Java,Aop,Aspectj,我目前有一个方面可以捕获包中的所有公共方法执行 我想修改它以排除setter和getter,所以我尝试了这一点,以下是我尝试的变体: 这一个有效,但显然对二传手或传接手没有任何作用 @Around("execution(public * *(..)) && !within(com.walterjwhite.logging..*)") 这不会编译: @Around("execution(public * *(..)) && !within(* set*(..))"

我目前有一个方面可以捕获包中的所有公共方法执行

我想修改它以排除setter和getter,所以我尝试了这一点,以下是我尝试的变体:

这一个有效,但显然对二传手或传接手没有任何作用

@Around("execution(public * *(..)) && !within(com.walterjwhite.logging..*)")
这不会编译:

@Around("execution(public * *(..)) && !within(* set*(..))")
这会编译,但不会阻止捕获setter/getter:

@Around("execution(public * *(..)) && !execution(* set*(..))")
我也看到了这篇文章作为参考,但那不起作用。我在尝试编译方面时遇到编译错误


第二个未编译,因为()中的
需要类型签名,而不是方法签名。你所指的答案完全错了,我不知道为什么会被接受。我写这封信只是为了纠正那些错误的信息

你的最后一次尝试基本上是正确的,但只会忽略二传手,而不会忽略获得者。试试这个:

驱动程序应用程序:

package de.scrum\u master.app;
公共类应用程序{
私有int-id;
私有字符串名称;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共无效剂量测定法(){
System.out.println(“做某事”);
}
公共静态void main(字符串[]args){
应用程序=新应用程序();
应用程序.setId(11);
应用程序。设置名称(“John Doe”);
application.doSomething();
System.out.println(application.getId()+“-”+application.getName());
}
}
方面:

package de.scrum\u master.aspect;
导入org.aspectj.lang.ProceedingJoinPoint;
导入org.aspectj.lang.annotation.Around;
导入org.aspectj.lang.annotation.Aspect;
@面貌
公共类MyAspect{
@大约(“执行(public**(..)&&&!执行(void set*(*))&&&!执行(!void get*())”)
公共对象myAdvice(ProceedingJoinPoint thisJoinPoint)抛出可丢弃的{
System.out.println(此连接点);
返回此连接点。继续();
}
}
控制台日志:

执行(void de.scrum\u master.app.Application.main(字符串[])
执行(void de.scrum\u master.app.Application.doSomething())
做某事
11-无名氏
请注意

  • 如果您有像
    isActive()
    这样的布尔值的getter,并且还想忽略它们,那么您必须通过
    &&&扩展切入点!执行(布尔值为*())
  • 那些类型的带有名称模式的切入点总是试探性的,所以要小心方法名称,例如
    getaway
    settleConflict
    隔离
    。它们也将被忽略

第二个未编译,因为()中的
需要类型签名,而不是方法签名。你所指的答案完全错了,我不知道为什么会被接受。我写这封信只是为了纠正那些错误的信息

你的最后一次尝试基本上是正确的,但只会忽略二传手,而不会忽略获得者。试试这个:

驱动程序应用程序:

package de.scrum\u master.app;
公共类应用程序{
私有int-id;
私有字符串名称;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共无效剂量测定法(){
System.out.println(“做某事”);
}
公共静态void main(字符串[]args){
应用程序=新应用程序();
应用程序.setId(11);
应用程序。设置名称(“John Doe”);
application.doSomething();
System.out.println(application.getId()+“-”+application.getName());
}
}
方面:

package de.scrum\u master.aspect;
导入org.aspectj.lang.ProceedingJoinPoint;
导入org.aspectj.lang.annotation.Around;
导入org.aspectj.lang.annotation.Aspect;
@面貌
公共类MyAspect{
@大约(“执行(public**(..)&&&!执行(void set*(*))&&&!执行(!void get*())”)
公共对象myAdvice(ProceedingJoinPoint thisJoinPoint)抛出可丢弃的{
System.out.println(此连接点);
返回此连接点。继续();
}
}
控制台日志:

执行(void de.scrum\u master.app.Application.main(字符串[])
执行(void de.scrum\u master.app.Application.doSomething())
做某事
11-无名氏
请注意

  • 如果您有像
    isActive()
    这样的布尔值的getter,并且还想忽略它们,那么您必须通过
    &&&扩展切入点!执行(布尔值为*())
  • 那些类型的带有名称模式的切入点总是试探性的,所以要小心方法名称,例如
    getaway
    settleConflict
    隔离
    。它们也将被忽略

谢谢,为简洁起见,我省略了getter部分,一旦我让setters开始工作,添加getter应该是小菜一碟了。是的,我将添加is,是的,因为这已经是一种启发式方法,所以我正在考虑如何在我的代码的其余部分最好地实施命名模式,以避免这种冲突。自从我开始使用aspectj进行日志记录以来,以大纲形式编写代码使日志记录易于解释,而且我几乎不编写日志语句。这很有效,非常感谢。请注意,我在
中稍微改进了切入点!执行(无效集*(*)和&!执行(!void get*())
,即我强制setter具有void返回类型和一个参数,getter具有非void返回类型和无参数。同样地
!执行(布尔值为*())
强制返回布尔值。这使得启发式更加精确,并且误报更少。另一个想法是:不用强制命名模式,你可以定期扫描你的代码库以查找pr