Android Java,如何获取类属性的值?



我想获取一个类属性的值,但我得到异常: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异常。

我尝试了这些解决方案,但无济于事...

  1. getField方法更改为getDeclaredField

  2. 用try/catch包围代码,并得到另一个错误(不兼容的类型:java.lang.String和java.lang.reflect.Field(

  3. 使 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")

  1. 如果你在类"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
}

  1. 如果类 "Person" 中的变量是静态的:

String valueString = Person.name /*The value you are looking for*/

    如果你的变量
  1. 不是静态的,而是 public:
    IMPORTANT(如果你没有为变量设置默认值(:
    在这种情况下,该值将是一个空字符串,因为您正在创建 calss 的新实例。您可以在 Person 类的构造函数中设置"人名",以另一种方式获得空字符串,因为变量不是静态的。

Person _person = new Person();
String personName = _person.name;

由于这是您声明的常量,因此请使用类名直接访问它,如下所示,

String name = Person.name;

这是一个静态常量。静态意味着一次只能有一个值。或者这样说:类属性"name"是属性,而不是对象属性!该属性属于该类!

因此,无需创建 Person 类的实例。

您只能使用:

String name = Person.name;

请记住:这仅适用于名称属于类。它这样做,因为你声明了你的名称变量是静态的。

相关内容

  • 没有找到相关文章

最新更新