Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 如何从切入点中排除匿名内部方法?_Java_Aop_Aspectj - Fatal编程技术网

Java 如何从切入点中排除匿名内部方法?

Java 如何从切入点中排除匿名内部方法?,java,aop,aspectj,Java,Aop,Aspectj,我设置了一个AspectJ跟踪例程,使用以下切入点记录方法的进入和退出条件: public aspect Trace { pointcut anyMethodExecuted(): execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within( is(AnonymousType) ); pointcut anyConstructorExecut

我设置了一个AspectJ跟踪例程,使用以下切入点记录方法的进入和退出条件:

public aspect Trace {       
    pointcut anyMethodExecuted():       execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !within( is(AnonymousType) );
    pointcut anyConstructorExecuted():  execution (biz.ianw.lanchecker.*.new(..)) && !within(Trace); 
在我的sendEmail类中,我有一个方法,该方法调用setDebugOut方法将调试输出重定向到LogOutputStream:

final private static  Logger log = LoggerFactory.getLogger(MailMail.class);
...
LogOutputStream losStdOut = new LogOutputStream() {             
    @Override
    protected void processLine(String line, int level) {
        log.debug(line);
    }
};    

public void sendPlainHtmlMessage(...) {  
    Session session = javaMailSender.getSession();
    PrintStream printStreamLOS = new PrintStream(losStdOut);
    session.setDebugOut(printStreamLOS);
    ...
这很好,除了跟踪类切入点截取匿名内部类的调用,并作为输出生成:

20:14:18.908 TRACE [biz.ianw.lanchecker.Trace] - Enters method: Logger biz.ianw.lanchecker.MailMail.access$0()
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] - Exits method: Logger biz.ianw.lanchecker.MailMail.access$0().
20:14:18.909 TRACE [biz.ianw.lanchecker.Trace] -   with return value: Logger[biz.ianw.lanchecker.MailMail]
20:14:18.909 DEBUG [biz.ianw.lanchecker.MailMail] - DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
我加了一个相当宽泛的词

&& !within( is(AnonymousType) )
条件设置为切入点,如上所示,但没有效果。事实上,我很难在任何地方找到(匿名类型)的文档


我如何编写一个切入点来排除这个匿名内部方法,最好是不影响任何其他方法?

这个答案是由Andrew Clement(参见,ff)提供的,经他许可后转载于此:

access$0方法已添加到MailMail中,因为日志在MailMail中是私有的-它允许log.debug(行)从匿名类(可能称为MailMail$1)访问日志

认识到这一点,我们可以看到access$0不在匿名类中,它是在MailMail类中生成的访问器,因此您的附加切入点片段不起作用

两种选择:

具体排除:

pointcut anyMethodExecuted():       execution (* biz.ianw.lanchecker.*.*(..)) && !within(Trace) && !execution(* MailMail.access$0(..));
排除所有合成访问器(它被认为是合成的,因为它是由编译器“生成”的,以支持您正在执行的操作):

或者你可以排除所有合成物,也许:

pointcut anyMethodExecuted():       execution (!synthetic * biz.ianw.lanchecker.*.*(..)) && !within(Trace);

不知道这是否相关
joinPoint.getStaticPart().getSignature().getDeclaringType().isAnonymousClass()
返回
False
…访问$0()
toLongString()
将方法签名显示为:
execution(static org.slf4j.Logger biz.ianw.lanchecker.MailMail.access$0())
pointcut anyMethodExecuted():       execution (!synthetic * biz.ianw.lanchecker.*.*(..)) && !within(Trace);