能否在进入某个类的时候 
比如我 类A 方法m
我调用方法m的时候 是否能提取到方法名称以及是哪个类的

解决方案 »

  1.   

    可以,这个完全可以有。网上可以搜索 spring aspectj JoinPoint
    通过使用joinPort就可以取得相应的信息。
      

  2.   


    <bean id="logInterceptor"
    class="com.sshframework.generic.aop.interceptor.EventLogInterceptor">
    <property name="systemLogService" ref="systemLogService" />
    </bean>
    <aop:config>
    <aop:aspect id="logAspect" ref="logInterceptor">
    <aop:before method="before" pointcut-ref="txPointcut" />
    <aop:after-returning method="afterReturning"
    pointcut-ref="txPointcut" />
    <aop:after-throwing method="afterThrowing"
    pointcut-ref="txPointcut" throwing="ex" />
    </aop:aspect>
    </aop:config>定义好拦截器 然后实现相应的触发类
    @AfterThrowing(value = "execution ( * com.devtek.service.impl.*.*(..) )", pointcut = "execution ( * com.devtek.service.impl.*.*(..) )")
    public void afterThrowing(JoinPoint jp) throws Throwable {
    System.out.println("日志记录开始,访问的方法为"
    + jp.getTarget().getClass().getName() + "."
    + jp.getSignature().getName() + "(),产生异常");
    }
      

  3.   

    XML code
      <bean id="logInterceptor"
      class="com.sshframework.generic.aop.interceptor.EventLogInterceptor">
      <property name="systemLogService" ref="systemLogService" />
      </bean>
      <aop:config>
      <aop:aspect id="logAspect" ref="logInterceptor">
      <aop:before method="before" pointcut-ref="txPointcut" />
      <aop:after-returning method="afterReturning"
      pointcut-ref="txPointcut" />
      <aop:after-throwing method="afterThrowing"
      pointcut-ref="txPointcut" throwing="ex" />
      </aop:aspect>
      </aop:config>
      

  4.   

    可以,但是这样的日志基本上没有什么用处!下面是我对日志的一些看法,是原来在其他帖子中的回复,供为参考:很多介绍 AOP 的地方都采用日志来作为介绍,实际上日志要采用切面的话是极其不科学的,希望以后写文章、写书的人介绍 AOP 不要拿日志作为示例来介绍了,避免对开发者进行误导。没有人会只在方法的开始和结束,或者是异常三处写日志的。对于日志来说,只是在方法开始、结束、异常时输出一些什么,那是绝对不够的,这样的日志对于日志分析没有任何意义,如果在方法的开始和结束整个日志,那方法中呢?如果方法中没有日志的话,那就完全失去了日志的意义!如果应用出现问题要查找由什么原因造成的,也没有什么作用。这样的日志还不如不用!日志在应用程序中是非常非常重要的,好的日志信息能有助于我们在程序出现 BUG 时能快速进行定位,并能找出其中的原因,但是很多的开发人员很不重视日志。日志是与代码和业务逻辑密切相关的,以目前的 Java 技术只能将日志嵌入到代码之中。对于 Java 开发人员来说,我感觉其对日志的思维很浅,能正确在代码中应用日志的开发人员不会超过 50%。对于 Java Web 开发人员来说这个百分比可以低到吓人的程度,绝大多数的 Java Web 开发人员根本就没有写日志的习惯。我发觉很多很多的开发人员不会使用日志,其所称的日志一般都是这样的:public User processUser(User user) {    
        log.debug("processUser() start...");
        try {
            processUser 代码
        } catch (Exception e) {
            log.error("processUser() failed.", e);
        }
        log.debug("processUser() end.");
    }这样的日志写了跟没写一样,没有丝毫的用处!日志最常用的级别在 log4j 中有 DEBUG、INFO、WARN、ERROR 四种,在 JDK log 中最常用的有 FINE、INFO、WARNING、SEVERE。什么时候应用什么级别的日志是很有讲究的。我曾看到有人的代码中的日志级别全部都是一样的 DEBUG 或者是 INFO,而且清一色地在 catch 块中都是 ERROR。对于 DEBUG 级别的日志来说,是越多越好,越详细越好。另外建议使用 slf4j 日志框架,其中的 log4j 的适配器。slf4j 可以使用可变参数,我们不需要在代码中出现:if(log.isDebugEnabled()) {
        log.debug("user: " + user);
    }上面这样的代码。因为 log.debug 中涉及字符串连接操作,大家都知道字符串是不可变对象,内部会使用 StringBuffer 或者 StringBuilder 进行处是的。如果我们把日志调高到 INFO 的话,那些 log.debug 方法参数同样会被运算出来,但是这种运算是毫无意义的,因此我们会在外面加上:if(log.isDebugEnabled()) 这个判断。如果使用变参,由于不涉及字符串连接操作,因此就不需要这样的判断。public User processUser(User user) {    
        log.debug("processUser() start, user: {}", user);
        try {
            processUser 代码      // 这里应加入大量的 log.debug 日志
            log.info("......");   // 处理完后的结果应使用 INFO 级别,内容应为处理后的 User 对象的数据
        } catch (Exception e) {
            log.error("processUser() failed.", e);  // 异常时应使用 WARN 以上的级别,如果还有其他的方法调用上下文信息应一起写入日志  
        }
        log.debug("processUser() end.");    // 这个日志没有丝毫用处,可以删除 
    }一个好的日志,能在出现错误之后,能快速地进行错误定位,以及分析是由什么原因造成的,进而修改 BUG 避免在今后的代码是出现类似的错误。日志在应用程序中的地位是很重要的,希望大家都能正视和重视!