我想获取一个类属性的值,但我得到异常:java.lang.NoSuchFieldException
人.class
public class Person {
public static final String name = "person name";
}
主要活动.class
...
private void method() {
Class myClass = Person.class;
String name = myClass.getField("name");
}
...
我正在为getField方法获得java.lang.NoSuchFieldException异常。
我尝试了这些解决方案,但无济于事...
将getField方法更改为getDeclaredField
用try/catch包围代码,并得到另一个错误(不兼容的类型:java.lang.String和java.lang.reflect.Field(
使 Android Studio 缓存失效并重新启动
我不知道如何访问此值,欢迎任何解决方案或建议。
提前谢谢。
将 getField 方法更改为 getDeclaredField
通过try/catch包围代码,并得到另一个错误(不兼容 类型:java.lang.String 和 java.lang.reflect.Field(
因为getDeclaredField
会返回类型为Field
的对象而不是String
, 只需将您的代码更改为此
Field field = myClass.getDeclaredField("name");
//do something with field
如果要访问字段的值,可以将get(...)
方法与 null 参数一起使用 - 因为它是静态字段,因此不需要任何实例:
private void method() {
Class myClass = Person.class;
Field field = myClass.getField("name");
String name = field.get(null);
Log.d("Test", "field value: " + name);
}
在您的情况下,无论您使用getField(...)
还是getDeclaredField(...)
.如果要获取其超类中的字段或类实现的接口,则需要使用后者。
例如,如果要从具有名为sample
的字段的类扩展Person
,则需要改用getDeclaredField("sample")
。
- 如果你在类"Person"中的变量是静态的:
(在我看来这不是最好的解决方案(
解释:getField 方法返回一个类型"field",所以你不能在没有转换的情况下从另一种类型保存到变量中。
YourField.get 返回一个对象,因此您无法在没有转换的情况下从另一种类型保存到变量中。
try{
Class _person = Person.class;
Field field = _person.getField("name");
Object value = field.get(null);
String valueString = (String)value; /*The String you are looking for*/
}catch (Exception e) {
//TODO handle exception
}
- 如果类 "Person" 中的变量是静态的:
String valueString = Person.name /*The value you are looking for*/
- 如果你的变量
- 不是静态的,而是 public:
IMPORTANT(如果你没有为变量设置默认值(:
在这种情况下,该值将是一个空字符串,因为您正在创建 calss 的新实例。您可以在 Person 类的构造函数中设置"人名",以另一种方式获得空字符串,因为变量不是静态的。
Person _person = new Person();
String personName = _person.name;
由于这是您声明的常量,因此请使用类名直接访问它,如下所示,
String name = Person.name;
这是一个静态常量。静态意味着一次只能有一个值。或者这样说:类属性"name"是类属性,而不是对象属性!该属性属于该类!
因此,无需创建 Person 类的实例。
您只能使用:
String name = Person.name;
请记住:这仅适用于名称属于类。它这样做,因为你声明了你的名称变量是静态的。