Đoạn mã dưới đây là một ví dụ nhỏ dễ dàng tái tạo vấn đề. Vì vậy, tôi có biến loại String, trên đó một giá trị mặc định được thiết lập. Tôi có 3 phương pháp:Java Introspection - hành vi kỳ lạ
- getter
- setter
- phương pháp thuận tiện có thể chuyển đổi chuỗi để boolean
Các mẫn không trả lại getter như readMethod và setter như writeMethod. Thay vào đó nó trả về phương thức isTest() làm readMethod. Setter rỗng.
Từ tài liệu, tôi hiểu rằng nếu loại đó là boolean, phương thức "is" có ưu tiên cao hơn so với get, nhưng kiểu là String, do đó không có ý nghĩa gì khi tìm kiếm "is-xxx " phương pháp?
public class Test {
public class Arguments {
private String test = Boolean.toString(true);
public boolean isTest() {
return Boolean.parseBoolean(test);
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IntrospectionException {
BeanInfo info = Introspector.getBeanInfo(Arguments.class);
System.out.println("Getter: " + info.getPropertyDescriptors()[1].getReadMethod());
System.out.println("Setter: " + info.getPropertyDescriptors()[1].getWriteMethod());
PropertyDescriptor descr = new PropertyDescriptor("test", Arguments.class);
System.out.println("T");
}
}
Có ai có hiểu biết về điều này không?
thông tin bổ sung:
- Trình tự không thay đổi kết quả. Phương thức isTest() luôn được xem là readMethod
- Trong trường hợp tôi chỉ cần đổi tên hàm isTest() thành bsTest(), nó chọn getter và setter là readMethod và writeMethod. Vì vậy, nó có cái gì để làm với "is-xxx".
Điều gì sẽ xảy ra nếu bạn khai báo phương thức 'isTest' ở cuối lớp? Nó có thể là nó được công nhận là boolean bởi vì đó là lần xuất hiện đầu tiên, và do đó setter không khớp với kiểu String. –
Không, nó không có ý nghĩa, nhưng rõ ràng đó là những gì họ quyết định (hoặc đó là một lỗi). Bạn không thể làm gì nhiều về điều này, ngoại trừ việc dừng để biểu diễn các boolean bằng các chuỗi: D – Dici
Tôi đã thêm một số thông tin khác trong văn bản ban đầu. Thứ tự không có ảnh hưởng đến kết quả. – Quirexx