什么是 PHP var_dump 的 Java 等价物?

PHP 有一个 Var _ dump ()函数,它输出对象的内部内容,显示对象的类型和内容。

例如:

class Person {
private $firstName;
private $lastName;


public function __construct($firstName, $lastName) {
$this->firstName = $firstName;
$this->lastName = $lastName;
}
}


$person = new Person('Jon', 'Smith');
var_dump($person);

将输出:

object(Person)#1 (2) {
["firstName:private"]=>
string(3) "Jon"
["lastName:private"]=>
string(5) "Smith"
}

在 Java 中做同样事情的等价物是什么?

113350 次浏览

它在 Java 中不是完全固化的,所以你不能免费得到它。它是通过约定而不是语言结构来完成的。在所有的数据传输类(甚至是 在你写的所有课程里。)中,您应该实现一个合理的 toString方法。因此,这里需要在 Person类中重写 toString()并返回所需的状态。

有一些 可供使用的公用设施可以帮助编写一个好的 toString 方法,或者大多数 IDE 都有一个自动的 toString()编写快捷方式。

您可以选择覆盖对象的 toString()方法,以您喜欢的方式输出其内容,或者使用反射来检查对象(类似于调试器的方式)。

使用反射的好处是,您不需要修改您的单个对象以使其具有“可分析性”,但是这会增加复杂性,如果您需要嵌套对象支持,则必须编写这种支持。

此代码将列出 Object“ o”的字段及其值

Field[] fields = o.getClass().getDeclaredFields();
for (int i=0; i<fields.length; i++)
{
System.out.println(fields[i].getName() + " - " + fields[i].get(o));
}

Apache commons lang 包提供了这样一个类,它可以用来构建默认的 toString ()方法,使用反射来获取字段的值。看看 这个

根据我的经验,var _ dump 通常用于调试 PHP,而不是单步调试器。在 Java 中,当然可以使用 IDE 的调试器查看对象内容的可视化表示。

我使用 小丑得到了合理的结果。

您可以进行 XML 序列化,即使是深度嵌套的对象也应该得到非常整洁的表示。

我发现这个方法转储对象,尝试这个 字符串转储(对象对象)

我认为最好的方法是使用 google-gson (一个 Java 库将 JSON 转换为 Java 对象,反之亦然)

下载 It,将“ jar”文件添加到项目中

HashMap<String, String> map = new HashMap<String, String>();


map.put("key_1", "Baku");
map.put("key_2", "Azerbaijan");
map.put("key_3", "Ali Mamedov");


Gson gson = new Gson();


System.out.println(gson.toJson(map));

产出:

{"key_3":"Ali Mamedov","key_2":"Azerbaijan","key_1":"Baku"}

您可以将任何对象(数组、列表等)转换为 JSON。我认为,这是最好的模拟 PHP 的 Var _ dump ()

我喜欢使用 GSON,因为它通常已经是我正在从事的项目类型的依赖:

public static String getDump(Object o) {
return new GsonBuilder().setPrettyPrinting().create().toJson(o);
}

或者用 GSON 代替您使用的任何其他 JSON 库。

我认为类似的方法是创建一个简单的方法来打印你想要看到的对象。就像这样:

public static void dd(Object obj) { System.out.println(obj); }

它与 var _ dump ()不同,但是您可以对它有一个大致的了解,而不需要转到调试器 IDE。

只需要在 Field 解决方案(setAccess)上添加,这样您就可以访问对象的私有变量:

public static void dd(Object obj) throws IllegalArgumentException, IllegalAccessException {
Field[] fields = obj.getClass().getDeclaredFields();
for (int i=0; i<fields.length; i++)
{
fields[i].setAccessible(true);
System.out.println(fields[i].getName() + " - " + fields[i].get(obj));
}


}