2013-03-19 22 views
5

Tôi có đường dẫn cho đối tượng trong đối tượng trong đối tượng và tôi muốn đặt đối tượng bằng cách sử dụng khả năng động của Groovy. Thông thường, bạn có thể làm như vậy chỉ bằng cách thực hiện như sau:Groovy: Đặt phương thức lồng nhau động sử dụng chuỗi như đường dẫn

class Foo { 
    String bar 
} 


Foo foo = new Foo 
foo."bar" = 'foobar' 

Điều đó hoạt động OK. Nhưng nếu bạn có các đối tượng lồng nhau thì sao? Một cái gì đó như:

class Foo { 
    Bar bar 
} 

class Bar { 
    String setMe 
} 

Bây giờ tôi muốn sử dụng các thiết lập năng động, nhưng

Foo foo = new Foo() 
foo."bar.setMe" = 'This is the string I set into Bar' 

Trả về một MissingFieldException.

Bất kỳ gợi ý nào?

CẬP NHẬT: Nhờ Tim đã chỉ cho tôi đúng hướng, mã ban đầu trên đó hoạt động tốt khi truy xuất thuộc tính, nhưng tôi cần đặt giá trị bằng chuỗi đường dẫn.

Đây là những gì tôi đã đưa ra từ trang Tim gợi ý:

công trình
def getProperty(object, String propertyPath) { 
    propertyPath.tokenize('.').inject object, {obj, prop -> 
     obj[prop] 
    } 
    } 

    void setProperty(Object object, String propertyPath, Object value) { 
    def pathElements = propertyPath.tokenize('.') 
    Object parent = getProperty(object, pathElements[0..-2].join('.')) 
    parent[pathElements[-1]] = value 
    } 
+1

http: //stackoverflow.com/questions/5488689/how-to-retrieve-nested-properties-in-groovy –

+0

Tôi đã có thể hoàn thành nhiệm vụ bằng cách xây dựng và sử dụng phương thức getProperty, tôi sẽ đặt câu trả lời ở trên kể từ khi nhận xét phần không phải là rất tốt để đặt mã vào –

Trả lời

1

Tiếp theo một cách chính xác.

foo."bar"."setMe" = 'This is the string I set into Bar'; 

Without getProperty trọng bạn có thể đạt được kết quả tương tự sử dụng "$ {}" cú pháp cho G-string như mã dưới đây giải thích

class Baz { 
    String something 
} 

class Bar { 

    Baz baz 

} 

class Foo { 
    Bar bar 
} 

def foo = new Foo() 
foo.bar = new Bar() 
foo.bar.baz = new Baz() 

def target = foo 
def path = ["bar", "baz"] 
for (value in path) { 
    target = target."${value}" 
} 

target."something" = "someValue" 
println foo.bar.baz.something 

in println thức "someValue" như mong đợi

+1

Chỉ là một bổ sung nhỏ cho câu trả lời tuyệt vời này để người khác tránh tình trạng này: Bạn cần sử dụng một cách rõ ràng 'double quotes' để làm việc, vì GStrings (với các biểu thức bên trong) được định nghĩa theo cách đó. Nhưng tôi đoán tất cả các bạn lập trình groovy đã biết rằng :) – kaskelotti

Các vấn đề liên quan