我java.lang.NoSuchFieldException
试图运行以下方法时得到一个:
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); }
Run Code Online (Sandbox Code Playgroud)
错误就行了 Time startTime = (Time)t.getClass().getField(day + "Start").get(t);
我不明白这个错误,因为monStart是Tutor
该类的一个字段:
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;
Run Code Online (Sandbox Code Playgroud)
我只是学习使用反射,所以我确定这是某种语法错误......
rge*_*man 149
该getField
方法只会找到该字段public
.您将需要使用该getDeclaredField
方法,它将找到直接在类上声明的任何字段,即使它不是public
.
Cos*_*atu 12
根据javadoc,Class.getField()
"返回一个Field
反映该Class
对象所代表的类或接口的指定公共成员字段的对象".使用getDeclaredField()
如果您要访问非公共领域.
小智 7
getClass().getField()
问题的最佳解决方案是:
使用getDeclaredField()而不是getField()
1) String propertyName = "test";
Class.forName(this.getClass().getName()).getDeclaredField(propertyName);
Run Code Online (Sandbox Code Playgroud)
2)用您的班级名称替换"HelloWorld"
String propertyName = "name";
HelloWorld.class.getDeclaredField(propertyName)
Run Code Online (Sandbox Code Playgroud)
如果要获取列的注释长度
HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()
Run Code Online (Sandbox Code Playgroud)
正如接受的答案中提到的,使用getDeclaredField
可能会解决您的问题(如果该字段未声明为public
)。
如果您仍然得到NoSuchFieldException
,那么可能是因为该字段实际上位于超类中!确实,如果你的类extends
是另一个类,那么你将无法通过该getDeclaredField
方法获得继承的字段。以下是解决该问题的方法:
String propertyName = "foo";
yourClass.getClass().getSuperClass().getDeclaredField(propertyName);
Run Code Online (Sandbox Code Playgroud)