Tương đương Java của var_dump PHP là gì?


127

PHP có hàm var_dump () để xuất nội dung bên trong của một đối tượng, hiển thị loại và nội dung của đối tượng.

Ví dụ:

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

sẽ xuất ra:

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

Tương đương trong Java sẽ làm như thế nào?


1
bạn đã thử db4o chưa? nó không đặc biệt cho việc này, nhưng tôi nghĩ sẽ hoạt động hoàn hảo;
Sức mạnh Bảo Bình

Câu trả lời:


67

Nó không hoàn toàn giống như trong Java, vì vậy bạn không nhận được nó miễn phí. Nó được thực hiện với quy ước chứ không phải là cấu trúc ngôn ngữ. Trong tất cả các lớp chuyển dữ liệu (và thậm chí trong tất cả các lớp bạn viết ... ), bạn nên thực hiện một toStringphương thức hợp lý . Vì vậy, ở đây bạn cần ghi đè toString()trong Personlớp của bạn và trả về trạng thái mong muốn.

các tiện ích có sẵn giúp viết phương thức toString tốt hoặc hầu hết các IDE đều có toString()lối tắt viết tự động .



Xem thêm stackoverflow.com/questions/9444573/ trên mẫu thay thế Guava và mẫu Intellij IDEA.
Vadzim

31

Theo kinh nghiệm của tôi, var_dump thường được sử dụng để gỡ lỗi PHP thay cho trình gỡ lỗi từng bước. Trong Java, tất nhiên bạn có thể sử dụng trình gỡ lỗi IDE của mình để xem biểu diễn trực quan của nội dung của đối tượng.


10
Yups, hầu hết PHP hoặc Nhà phát triển web đều quên việc gỡ lỗi. Bởi vì họ thích xem kết quả gỡ lỗi trong trình duyệt.
GusDeCooL

10
Bạn không thể sử dụng trình gỡ lỗi IDE của mình, ví dụ, nếu bạn đang lập trình mã JSP của mình trong trình soạn thảo dựa trên trình duyệt của Adobe Experience Manager. :(
Trevor

Có lẽ chúng tôi có thể sử dụng nó để kiểm tra hành vi của chương trình của bạn trong môi trường trực tiếp bằng cách in vardump ở định dạng html.
omjego

18

Các lựa chọn thay thế của bạn là ghi đè toString()phương thức của đối tượng của bạn để xuất nội dung của nó theo cách bạn thích hoặc sử dụng sự phản chiếu để kiểm tra đối tượng (theo cách tương tự như những gì trình gỡ lỗi làm).

Ưu điểm của việc sử dụng sự phản chiếu là bạn sẽ không cần phải sửa đổi các đối tượng riêng lẻ của mình thành "có thể phân tích được", nhưng có thêm độ phức tạp và nếu bạn cần hỗ trợ đối tượng lồng nhau, bạn sẽ phải viết điều đó.

Mã này sẽ liệt kê các trường và giá trị của chúng cho 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));
}

Lĩnh vực bạn đang sử dụng, được nhập từ đâu?
RMiranda

3
java.lang.reflect.Field
Harry Lime

17

Tôi nghĩ rằng cách tốt nhất để làm điều đó là sử dụng google-gson (Thư viện Java để chuyển đổi JSON thành các đối tượng Java và ngược lại)

Tải xuống , thêm tệp "jar" vào dự án của bạn

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

Đầu ra:

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

Bạn có thể chuyển đổi bất kỳ đối tượng nào (mảng, danh sách, v.v.) sang JSON. Tôi nghĩ rằng, đó là sự tương tự tốt nhất của var_dump () của PHP


4
Thật thú vị ... bạn có biết tại sao nó không phải là một phương thức tĩnh không?
mirelon

2
Bạn có thể sử dụng Nó giống như một phương thức tĩnh: new Gson (). ToJson (...) mà không cần tạo một biến mới.
Ali Mamedov

Imo, sẽ tốt hơn nếu bạn trừu tượng hóa nó thành một lớp tiện ích tùy chỉnh thay vì sử dụng trực tiếp, điều này cho phép bạn linh hoạt quản lý các phụ thuộc của bên thứ ba
MAYOBYO HASSAN



4

Tôi thích sử dụng GSON vì nó thường phụ thuộc vào loại dự án tôi đang làm:

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

Hoặc thay thế GSON cho bất kỳ thư viện JSON nào khác mà bạn sử dụng.



0

Bạn tuần tự hóa XML và bạn sẽ có được một biểu diễn rất gọn gàng ngay cả các đối tượng được lồng sâu.


0

Tôi nghĩ một cái gì đó tương tự bạn có thể làm là tạo ra một phương thức đơn giản in ra đối tượng bạn muốn xem. Một cái gì đó như thế này:

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

Nó không giống như var_dump (), nhưng bạn có thể có một ý tưởng chung về nó, mà không cần phải đến IDE trình gỡ lỗi của bạn.


0

Chỉ cần thêm vào giải pháp Trường (setAccessible) để bạn có thể truy cập biến riêng tư của một đối tượng:

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.