当前位置: 首页 > 知识库问答 >
问题:

在java中打印变量名和变量值的方法

施飞雨
2023-03-14
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 ;

有什么办法可以做到这一点吗?

提前感谢。

共有3个答案

司马宏茂
2023-03-14

由于这是用于调试的,您可以使用aspectj进行检测,因此您的代码在调试输出语句中保持干净,并且您可以根据需要改变方面。

定义一个集(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(* *);

设置点剪切以捕获分配,点连接到任何具有任何名称的变量,在示例中也可以是

pointcut assigmentPointCut() : set(String activityState);

建议,当给定的切点匹配时所需的行为

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

可以使用特殊参考thisJoinPoint访问有关点连接的信息。

龙星渊
2023-03-14

可以使用java反射来获取变量名和值。下面是一个示例代码;

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));
  }    

}
欧阳昊阳
2023-03-14

没有直接的解决方案来获取变量名。

但是,在有许多字段且不想手动打印其状态的上下文中,可以使用反射。

下面是一个简单的例子:

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
 类似资料:
  • 问题内容: 我在PHP中有一个POST,但我并不总是知道将要处理的变量字段的名称。 我有一个可以遍历值的函数(但是我也想捕获它附带的变量名。) 一旦弄清楚如何获取变量名,我还需要弄清楚如何使函数足够智能以检测和遍历变量的数组(如果存在)(即如果我有一些复选框值)。 问题答案: 如果您只想打印整个$ _POST数组以验证是否正确发送了数据,请使用print_r: 要递归打印数组的内容: 将一些填充应

  • 问题内容: 我有一个PostgreSQL函数 如何将DeletedContactId的值打印到控制台? 问题答案: 您可以按以下方式提出通知: 在这里阅读

  • 问题内容: 我有一堂课,其中包含有关Person的信息,看起来像这样: 我想返回所有变量。我试图使用反射来实现它,如该问题所示,但我无法打印实例变量。 解决此问题的正确方法是什么? 问题答案: 从实现toString:

  • 问题内容: 假设我有一个名为choice它的变量等于2。我将如何访问该变量的名称?相当于 用于制作字典。有一个很好的方法可以做到这一点,而我只是想念它。 编辑: 因此,这样做的原因是。我正在运行一些数据分析的东西,我在运行时使用多个我想调整或不调整的参数来调用程序。我从格式为.config的文件中读取了上次运行中使用的参数 当提示你输入值时,将显示先前使用的值,并且空字符串输入将使用先前使用的值。

  • /* main.c */ extern void print_var_1(void); extern void print_var_2(void); int main(void) { print_var_1(); print_var_2(); return 0; } /* static-1.c */ #include <stdio.h> static int var = 1;

  • 我的代码: 我试图像java语法一样打印变量C++,只是作为一个实验。但输出: