什么是PHP var_dump的Java等价物?

什么是PHP var_dump的Java等价物?,java,php,Java,Php,PHP有一个函数,输出对象的内部内容,显示对象的类型和内容。 例如: class Person { private $firstName; private $lastName; public function __construct($firstName, $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; } } $person = new Person

PHP有一个函数,输出对象的内部内容,显示对象的类型和内容。

例如:

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中有什么等价物可以做同样的事情呢?它在Java中并没有那么成熟,所以你不能免费获得它。它是通过约定而不是语言构造完成的。在所有数据传输类中(甚至在您编写的所有类中……),您应该实现一个合理的方法。因此,这里需要重写
Person
类中的
toString()
,并返回所需的状态


写一个好的toString方法有很多帮助,或者大多数IDE都有一个自动的
toString()
写快捷方式。

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

使用反射的优点是,您不需要将单个对象修改为“可分析”,但这会增加复杂性,如果您需要嵌套对象支持,则必须编写它

此代码将列出
对象的字段及其值

Field[]fields=o.getClass().getDeclaredFields();

对于(inti=0;i,ApacheCommonsLang包提供了这样一个类,可用于构建默认的toString()方法使用反射来获取字段的值。请看一看。

根据我的经验,var_dump通常用于调试PHP,而不是单步调试。在Java中,您当然可以使用IDE的调试程序来查看对象内容的可视表示。

我使用它,结果是合理的。

您可以使用XML序列化我发现这个方法可以转储对象,试试这个,我认为最好的方法是使用google gson(一个Java库,用于将JSON转换为Java对象,反之亦然)

如果需要,请将“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));

您可以将任何对象(数组、列表等)转换为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。

只需添加字段解决方案(setAccessible),即可访问对象的私有变量:

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

}
publicstaticvoiddd(objectobj)抛出IllegalArgumentException、IllegalAccessException{
Field[]fields=obj.getClass().getDeclaredFields();

对于(int i=0;i更新链接是指这两个链接都已失效),这(可能?):另请参见Guava alternative和Intellij IDEA模板。是的,大多数PHP或Web开发人员忘记了调试。因为他们更喜欢在浏览器中查看调试结果。例如,如果您在Adobe Experience Manager的基于浏览器的编辑器中编程JSP代码,则无法使用IDE的调试器(也许我们可以通过以html格式打印vardump来测试您的程序在实时环境中的行为。您正在使用的字段是什么,从何处导入的?java.lang.reflect.FieldInterest…您知道为什么它不是静态方法吗?您可以像静态方法一样使用它:new Gson().toJson(…)在不创建新变量的情况下。在我看来,最好是将其抽象为一个自定义实用程序类,而不是直接使用它,这为您提供了管理第三方依赖关系的灵活性。您尝试过db4o吗?它不是专门用于此目的的,但我认为它将非常有效;
public static void dd(Object obj) { System.out.println(obj); }
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));
    } 

}