2013-03-14 28 views
52

Tôi nhận được một java.lang.NoSuchFieldException khi cố gắng chạy các phương pháp sau đây:NoSuchFieldException khi lĩnh vực tồn tại

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 này là trên dòng 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 lĩnh vực của Tutor lớp học:

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ỉ học cách sử dụng sự phản chiếu, vì vậy tôi chắc chắn đây là một số loại lỗi cú pháp ...

Trả lời

121

Phương thức getField sẽ chỉ tìm trường nếu đó là public. Thay vào đó, bạn sẽ cần sử dụng phương thức getDeclaredField, 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 là public.

+0

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

+7

ohh được nó. tôi cần phải sử dụng setAccessible (true) – Subodh

10

Theo javadoc, Class.getField() "Trả về đối tượng Field 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 đối tượng Class này". Sử dụng getDeclaredField() nếu bạn muốn truy cập các trường ngoài công khai.

6

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" với lớp học của bạn tên

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

Nếu bạn muốn để có được độ dài chú thích của cột

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

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

Vì vậy, đối với những người đến đây, lỗi này cũng có thể gây ra bởi bộ nhớ cache không đồng bộ trong Android Studio. Tới File> làm mất hiệu lực Caches/Restart ...

Xem this cũng

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