簡體   English   中英

在Java中打印變量名稱和變量值的方法

[英]Way to print the variable name and variable value in java

String activityState = "resume";
DebugLog(activityState)

void DebugLog(String obj1) {}

如何使DebugLog像這樣打印:

activityState : resume

調試時,我經常在許多地方將許多打印語句寫為日志。 我會寫像

System.out.println("activityState : " + activityState);

我想要一種打印變量名稱和變量值的方法。 在C ++中,可以通過以下方式完成:

#define dbg(x) cout<< #x <<" --> " << x << endl ;

有什么辦法嗎?

提前致謝。

沒有直接解決方案來獲取變量名稱。

但是,在您有許多字段且不想手動打印其狀態的情況下,可以使用反射。

這是一個簡單的示例:

class MyPojo {
    public static void main(String[] args) {
        System.out.println(new MyPojo());
    }

    int i = 1;
    String s = "foo";

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        for (Field f: getClass().getDeclaredFields()) {
            try {
            result
            .append(f.getName())
            .append(" : ")
            .append(f.get(this))
            .append(System.getProperty("line.separator"));
            }
            catch (IllegalStateException ise) {
                result
                .append(f.getName())
                .append(" : ")
                .append("[cannot retrieve value]")
                .append(System.getProperty("line.separator"));
            }
            // nope
            catch (IllegalAccessException iae) {}
        }
        return result.toString();
    }
}

輸出量

i : 1
s : foo

您可以使用java Reflection獲得變量名稱和值。 這是一個示例代碼;

public class Example{

  String activityState = "resume";

  public static void main(String[] args) {

       Example example = new Example();
       Class<?> c = example.getClass();
       Field field = c.getDeclaredField("activityState");
       System.out.println(field.getName());
       System.out.println(field.get(example));
  }    

}

由於這是用於調試的,因此您可以對Aspectj使用檢測 ,因此您的代碼在調試輸出語句中保持清晰,並且可以根據需要放棄方面。

定義一個set(FieldPattern)切點以捕獲所有字段分配(連接點)

public aspect TestAssignmentAspect {

    pointcut assigmentPointCut() : set(* *);

    after() : assigmentPointCut() {
        System.out.printf("%s = %s%n", thisJoinPoint.getSignature().getName(),
                String.valueOf(Arrays.toString(thisJoinPoint.getArgs())));
    }
}

這是測試課

public class Test {

    public static String activityState = "stopped";

    public static void main(String[] args) {
        activityState = "start";

        doSomething();

        activityState = "pause";

        doSomeOtherthing();

        activityState = "resume";

        System.out.printf("the end!%n");
    }

    private static void doSomeOtherthing() {
        System.out.printf("doing some other thing...%n");
    }

    private static void doSomething() {
        System.out.printf("doing something...%n");
    }
}

如果在編織方面運行此示例,則輸出為

activityState = [stopped]
activityState = [start]
doing something...
activityState = [pause]
doing some other thing...
activityState = [resume]
the end!

說明

pointcut assigmentPointCut() : set(* *);

set切點以捕獲分配,該點連接到具有任何名稱的任何變量,在示例中也可以是

pointcut assigmentPointCut() : set(String activityState);

建議 ,給定切入點匹配時的期望行為

after() : assigmentPointCut() { ... }

可以使用特殊引用thisJoinPoint訪問有關點連接的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM