有什么方法可以将常用的动态例程复制到Java方法中?

时间:2019-05-15 01:42:10

标签: java

java的新手,我目前依靠大量输出消息来跟踪活动。我想要一种干净利落的方法,以使“半冗余”代码尽可能不明显。

最初,我正在这样做:(请注意System.out.println语句。)

package hamburger;
...
public class Hamburger extends Application {
    ...
    public static void main(String args[]){                  
        System.out.println("--->  hamburger.Hamburger.main");  
        ...
        String [] drink = {"pepsi"};
        NoCoke.onlypepsi(drink);
        ...  ...
public class NoCoke
    public static void main(String args[]){                  
        System.out.println("--->  hamburger.NoCoke.main");  
        ...
    static void justpepsi(String... commandIn){
        System.out.println("--->  hamburger.NoCoke.justpepsi");  
        ... 
        try{ to get coke anyway... 

当然,当我四处移动或重命名内容时,所有这些文字都必须进行更新,因此我开始使用以下三行来动态地执行操作:

public class Hamburger
public static void main(String[] args) { 
    String nameClass  = new Throwable().getStackTrace()[0].getClassName(); 
    String nameMethod = new Throwable().getStackTrace()[0].getMethodName(); 
    System.out.println("--->  "+nameClass+"."+nameMethod);  

public class NoCoke
public static void main(String args[]){                  
    <AND HERE>
    public static void justpepsi(String... commandIn){
    <AND HERE>      

工作正常:

--->  hamburger.Hamburger.main
--->  hamburger.NoCoke.main
--->  hamburger.NoCoke.justpepsi

但是我讨厌它的外观,占用空间等。

在Java中是否有类似“复制书”的内容? -包含可执行代码的文档可以放在任何地方?还是有一个过程可以将代码定义为可以在构造函数中声明的“字符串”之类的东西,例如:

StringThing nameMessageRoutine = new (whatever...) StringThing
   "String nameClass  = new Throwable()...<etc>...
    System.out.println('--->  '+nameClass+'.'+nameMethod);'"  

...我可以像这样“导入”或“引用”:

public class Hamburger extends Application {
public static void main(String args[]){ 
    import: nameMessageRoutine;         //outside of the package member

public class NoCoke
public static void main(String args[]){                  
    reference: nameMessageRoutine;      //defined in the constructor

1 个答案:

答案 0 :(得分:1)

此方法打印有关调用位置的信息:

static void printCurrent() {
    final StackTraceElement ste = new Throwable().getStackTrace()[1];
    String methodName = ste.getMethodName();
    String className = ste.getClassName();
    String lineNum = ""+ste.getLineNumber();
    System.out.println(className + ", " + methodName + ", Line " + lineNum);
}

例如:

package randomTest;

public class MainClass {
    public static void main(String[] args) {
        printCurrent();
    }
}

输出为

randomTest.MainClass, main, Line 131

编辑: 我知道这并不能完全回答问题,但是它确实实现了跟踪代码活动的最终目标。要回答这个问题(按照标题),在纯Java中无法自动将例程插入标记的位置。