上文讲述了如何获取类名和方法名,敬请参阅: 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()" + "\t" + ste[i].getClassName() + "\n" + "ste[" + i + "].getFileName()" + "\t" + ste[i].getFileName() + "\n" + "ste[" + i + "].getMethodName()" + "\t" + ste[i].getMethodName() + "\n" + "ste[" + i + "].getLineNumber()" + "\t" + ste[i].getLineNumber() + "\n" ); } } /** * 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()" + "\t" + ste[i].getClassName() + "\n" + "ste[" + i + "].getFileName()" + "\t" + ste[i].getFileName() + "\n" + "ste[" + i + "].getMethodName()" + "\t" + ste[i].getMethodName() + "\n" + "ste[" + i + "].getLineNumber()" + "\t" + ste[i].getLineNumber() + "\n" ); } } }
源码运行结果如下所示:
在实际应用中,各位小主参照此方法进行相应的变更即可,也可将此相关信息封装成方法,定制适合测试框架等的输出,注意通过 Exception 或 Thread 获取相关信息时的不同(此部分后续会做一些简单的示例,给各位小主参阅,敬请期待)!
至此, Java学习-025-类名或方法名应用之一 -- 调试源码 顺利完结,希望此文能够给初学 Java 的您一份参考。
最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^
时间: 2024-10-04 14:07:45