zoukankan      html  css  js  c++  java
  • Java学习-025-类名或方法名应用之一 -- 调试源码

    上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文

    通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的包名、类名、方法名、行数,从而快速定位,及统计方法被调用的次数,生成类方法关系链。

    相信爱钻研的小主们,通过上篇文章,已经懂得了,如何获取主调方法、从调方法。那我直接上码了,敬请各位小主参阅,若有不足之处,敬请各位大神指正,不胜感激!

    GetClassMethodName.java 源码内容如下所示:

    /**
     * Aaron.ffp Inc.
     * Copyright (c) 2004-2015 All Rights Reserved.
     */
    package com.java.demo;
    
    import org.testng.annotations.Test;
    
    /**
     * Get information of class and method
     * 
     * @author Aaron.ffp
     * @version V1.0.0: Jsoup com.java.demo GetClassMethodName.java, 2015-8-13 10:58:39 Exp $
     */
    public class GetClassMethodName extends InvokeClass{
    
        
        /**
         * Debug code demo use Exception
         * 
         * @author Aaron.ffp
         * @version V1.0.0: Jsoup com.java.demo GetClassMethodName.java test_invokeMethod_001, 2015-8-14 12:50:32 Exp $
         *
         */
        @Test
        public void test_invokeMethod_001(){
            System.out.println(" ====== Main Invoke Method : GetClassMethodName.test_invokeMethod_001() =========================== ");
            this.invokeMethod_001();
        }
        
        /**
         * Debug code demo use Thread
         * 
         * @author Aaron.ffp
         * @version V1.0.0: Jsoup com.java.demo GetClassMethodName.java test_invokeMethod_002, 2015-8-14 12:51:33 Exp $
         *
         */
        @Test
        public void test_invokeMethod_002(){
            System.out.println(" ====== Main Invoke Method : GetClassMethodName.test_invokeMethod_002() =========================== ");
            this.invokeMethod_002();
        }
    }
    

    InvokeClass.java 源码内容如下所示:

    /**
     * Aaron.ffp Inc.
     * Copyright (c) 2004-2015 All Rights Reserved.
     */
    package com.java.demo;
    
    import com.demo.HelperReporter;
    
    
    /**
     * Invoked class
     * 
     * @author Aaron.ffp
     * @version V1.0.0: Jsoup com.java.demo InvokeClass.java, 2015-8-14 01:15:12 Exp $
     */
    public class InvokeClass extends HelperReporter{
        /**
         * By Exception
         * 
         * @author Aaron.ffp
         * @version V1.0.0: Jsoup com.java.demo InvokeClass.java invokeMethod_001, 2015-8-14 01:15:51 Exp $
         *
         */
        public void invokeMethod_001(){
            StackTraceElement[] ste = new Exception().getStackTrace();
            
            System.out.println(" ====== Invoked Method : InvokeClass.invokeMethod_001() =========================== ");
            
            for (int i = 0; i < ste.length; i++) {
                if (i > 1) {
                    break;
                }
                
                System.out.println("ste[" + i + "].getClassName()" + "	" + ste[i].getClassName() + "
    " +
                                   "ste[" + i + "].getFileName()" + "	" + ste[i].getFileName() + "
    " +
                                   "ste[" + i + "].getMethodName()" + "	" + ste[i].getMethodName() + "
    " +
                                   "ste[" + i + "].getLineNumber()" + "	" + ste[i].getLineNumber() + "
    "
                                   );
            }
        }
        
        /**
         * By Thread
         * 
         * @author Aaron.ffp
         * @version V1.0.0: Jsoup com.java.demo InvokeClass.java invokeMethod_002, 2015-8-14 01:16:19 Exp $
         *
         */
        public void invokeMethod_002(){
            StackTraceElement[] ste = Thread.currentThread().getStackTrace();
            
            System.out.println(" ====== Invoked Method : InvokeClass.invokeMethod_002() =========================== ");
            
            for (int i = 0; i < ste.length; i++) {
                if (i < 1 || i > 2) {
                    continue;
                }
                
                System.out.println("ste[" + i + "].getClassName()" + "	" + ste[i].getClassName() + "
    " +
                                   "ste[" + i + "].getFileName()" + "	" + ste[i].getFileName() + "
    " +
                                   "ste[" + i + "].getMethodName()" + "	" + ste[i].getMethodName() + "
    " +
                                   "ste[" + i + "].getLineNumber()" + "	" + ste[i].getLineNumber() + "
    "
                                  );
            }
        }
    }
    

    源码运行结果如下所示:

     

    在实际应用中,各位小主参照此方法进行相应的变更即可,也可将此相关信息封装成方法,定制适合测试框架等的输出,注意通过 Exception 或 Thread 获取相关信息时的不同(此部分后续会做一些简单的示例,给各位小主参阅,敬请期待)!

     

    至此, Java学习-025-类名或方法名应用之一 -- 调试源码 顺利完结,希望此文能够给初学 Java 的您一份参考。

    最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

     

  • 相关阅读:
    python面向对象的3个特点
    Redis-哈希槽
    PEP8 Python 编码规范
    每个人都要对自己进行5 项必要投资
    机器码和字节码
    python优缺点分析及python种类
    Zookeeper安装及运行
    Zookeeper简介与集群搭建
    Nginx Linux详细安装部署教程
    Nginx代理功能与负载均衡详解
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/4728858.html
Copyright © 2011-2022 走看看