NoSuchFieldException khi trường tồn tại


75

Tôi nhận được một java.lang.NoSuchFieldExceptionkhi cố gắng chạy phương pháp sau:

 public void getTimes(String specialty, String day) {
    ArrayList<Tutor> withSpec = new ArrayList<Tutor>();
    for (Tutor t : tutorList){
        try {
            Time startTime = (Time)t.getClass().getField(day + "Start").get(t);
        } catch (NoSuchFieldException | SecurityException | IllegalAccessException ex) Logger.getLogger(DBHandler.class.getName()).log(Level.SEVERE, null, ex); }

Lỗi là trên đường dây Time startTime = (Time)t.getClass().getField(day + "Start").get(t);

Tôi không hiểu lỗi này, vì monStart là một trường của Tutorlớp:

Public class Tutor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "tutorID")
private Integer tutorID;

.... 

@Column(name = "monStart")
@Temporal(TemporalType.TIME)
 Date monStart;

Tôi chỉ đang học cách sử dụng phản xạ, vì vậy tôi chắc chắn rằng đây là một số loại lỗi cú pháp ...


Nó có làm hỏng ứng dụng của bạn không?
IgorGanapolsky

Câu trả lời:


158

Các getFieldphương pháp sẽ chỉ tìm thấy lĩnh vực này nếu nó public. getDeclaredFieldThay vào đó, bạn sẽ cần sử dụng phương thức này, phương thức này sẽ tìm thấy bất kỳ trường nào được khai báo trực tiếp trên lớp, ngay cả khi nó không phải public.


ngay cả sau khi sử dụng getDeclaredField qua getField iam nhận được lỗi này: - không thể truy cập vào một thành viên của lớp học với từ bổ nghĩa "private"
Subodh

10
ohh hiểu rồi. tôi cần phải sử dụng setAccessible (true)
Subodh

3
Tôi nhận được NoSuchFieldExceptionngay cả khi đang sử dụng getDeclaredField()và lỗi "có quyền truy cập riêng tư" ngay cả sau khi sử dụng setAccessible(true). Ví dụ 1 : Field fieldy = rootElement.getClass().getDeclaredField("name");ném NoSuchFieldException. Nhưng làm Field[] fields = rootElement.getClass().getDeclaredFields();cho phép tôi lặp qua các trường và khi tôi gọi field.getName(), nó trả về "tên". Vậy thỏa thuận là gì?
Joe Flack

1
Giải quyết : Hình như tôi đã phải quấn trong một try / catch
Joe Flack

12

Theo javadoc, Class.getField()"Trả về một Fieldđối tượng phản ánh trường thành viên công khai được chỉ định của lớp hoặc giao diện được đại diện bởi Classđối tượng này ". Sử dụng getDeclaredField()nếu bạn muốn truy cập các trường không công khai.


8

Các giải pháp tốt nhất cho getClass().getField()vấn đề là:

Sử dụng getDeclaredField () thay vì getField ()

1)  String propertyName = "test";
    Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

2) Thay thế "HelloWorld" bằng tên lớp của bạn

    String propertyName = "name";
    HelloWorld.class.getDeclaredField(propertyName)

Nếu bạn muốn lấy độ dài chú thích của cột

HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()

2

Tôi đến với câu hỏi này dựa trên tiêu đề. Tôi đã gặp lỗi tương tự ( NoSuchFieldException) trong dự án Android của mình nhưng vì một lý do khác.

Vì vậy, đối với những người khác đến đây, lỗi này cũng có thể do bộ nhớ đệm không đồng bộ trong Android Studio. Đi tới Tệp> Không hợp lệ bộ nhớ cache / Khởi động lại ...

Xem này cũng


1

Đối với bất kỳ nhà phát triển Android nào thấy điều này dường như vẫn không thể khắc phục được sự cố, hãy kiểm tra xem Proguard đã được bật chưa. Nếu đúng như vậy, có thể lớp được đề cập đang bị xáo trộn và bạn sẽ cần thêm các quy tắc để ngăn điều đó xảy ra.

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.