2015-03-08 23 views
7

Tóm tắt:GSON trực tiếp truy cập các thành viên riêng tư?

không truy cập GSON thành viên private của một lớp trực tiếp mà không cần gọi phương thức getter của mình để lấy giá trị?


Nguyên tắc của Java mà được theo sau là nếu lớp B có thành viên riêng nó không thể được truy cập bởihạng A mà không getter phương pháp/setter.

Bây giờ tôi đã làm việc trên một dự án với GSON nơi trong tôi nhận được một getter cảm giác/phương pháp setter đang được bỏ qua [không được sử dụng, và là thành viên tư nhân trực tiếp truy cập]

Vâng chỉ là một sinh viên vì vậy tôi có thể có thể bị thiếu một số hoạt động phổ biến.

hạng A

public class A { 
public static void main(String[] args) { 
    B b = new B(); 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
    System.out.println(gson.toJson(b)); 
    System.out.println("--end--"); 
} 
} 

lớp B

public class B { 
private int a; 

public B() { 
    a = 1; 
} 

public int getA() { 
    System.out.println("I am invoked !"); 
    return 10; 
} 

public void setA(int a) { 
    this.a = a; 
} 
} 

Lưu ý: Bà được gán giá trị là 1, và tôi mã Geta() để luôn luôn trả 10

nếu tôi truy cập Bà từ lớp A, mọi thứ hoạt động như mong đợi và nó wont cho tôi làm điều đó, tất cả tiền phạt đến đây


GSON nghi ngờ bắt đầu ở đây

public class A { 
public static void main(String[] args) { 
    B b = new B(); 
    Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
    System.out.println(gson.toJson(b)); 
    System.out.println("--end--"); 
} 
} 

bây giờ kể từ khi Ba là tư nhân nó là vụ phải gọi phương thức getter được mã hóa để luôn luôn trả lại 10 NHƯNG đầu ra tôi nhận được là

Output:

{ 
    "a": 1 
} 
--end-- 

nên nói cách khác phương thức getter của tôi đối với phương pháp tư nhân được KHÔNG BAO GIỜ gọi

+1

GSON có thể cần phải lấy tên trường theo phản ánh, vì vậy tôi đoán nó đọc các giá trị bằng cách phản chiếu, vì phản ánh có thể bỏ qua các công cụ sửa đổi truy cập. Đọc thêm [tại đây] (http://docs.oracle.com/javase/tutorial/reflect/). – kajacx

+0

@kajacx tôi thấy liên kết của bạn, trông Reflection là cách gson hoạt động coz trong doc oracle của sự phản ánh, dưới ** Những nét vẽ của Reflection **, và ** Exposure of Internals ** nó được đề cập về ** truy cập thành viên riêng * * –

Trả lời

12

đóng gói gì bạn đang nói về là. Đây là một khái niệm Object Orientated hạn chế sự truy cập của các thành viên lớp nhất định.

Tuy nhiên, Java có một cách khác để truy cập các giá trị trong một đối tượng. Đó là, sự phản chiếu. Điều này cho phép truy cập chung hơn vào một lớp. Ví dụ, trong trường hợp của Gson, họ cần phải biết về mỗi trường trong một lớp, nhưng họ không thể viết một phương thức cho mọi lớp tồn tại. Tương tự như vậy, họ không thể yêu cầu bạn viết một bộ chuyển đổi JSON cho nó. Điều đó đánh bại quan điểm của khuôn khổ.

Có bản phản chiếu.Nó cho phép thư viện Gson có một phương thức để chuyển đổi đối tượng thành một số JSON. Điều này rất quan trọng vì thư viện Reflections cung cấp một API để nhận các thành viên riêng của một lớp mà không cần phải thông qua accessors và mutators.

tắm Reading

  • Bạn nên có một cái nhìn vào Reflection. Nó là một API rất mạnh mẽ.
Các vấn đề liên quan