【问题标题】:Android Java, How to get the value of class attribute?Android Java,如何获取类属性的值?
【发布时间】:2020-04-30 15:04:22
【问题描述】:

我想获得一个类属性的值,但我得到了异常:java.lang.NoSuchFieldException

Person.class

public class Person {

    public static final String name = "person name";

}

MainActivity.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 缓存失效并重启

我不知道如何访问这个值,欢迎任何解决方案或建议。

提前致谢。

【问题讨论】:

    标签: java class class-attributes


    【解决方案1】:

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

    因此您不需要创建 Person 类的实例。

    你可以使用:

    String name = Person.name;
    

    记住:这只适用于名称属于该类的情况。之所以这样做,是因为您将 name 变量声明为静态。

    【讨论】:

      【解决方案2】:
      1. 如果“Person”类中的变量是静态的:
        (在我看来,这不是最好的解决方案)

        说明:getField 方法返回一个类型“字段”,因此您不能在没有转换的情况下将另一种类型的变量保存到变量中。
        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. 如果您的变量不是静态的而是公开的:
        重要提示(如果您没有为变量设置默认值):
        在这种情况下,该值将是一个空字符串,因为您正在创建一个新的 cals 实例。您可以在 Person 类的构造函数中设置“人名”,因为该变量不是静态的,因此您将获得一个空字符串。

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

      【讨论】:

        【解决方案3】:

        如果要访问字段的值,可以使用带有 null 参数的 get(...) 方法 - 因为它是静态字段,所以不需要任何实例:

        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(...) 都没有关系。如果您想获取其超类中的字段或您的类实现的接口,则需要使用后者。

        例如,如果 Person 要从具有名为 sample 的字段的类扩展,则需要改用 getDeclaredField("sample")

        【讨论】:

          【解决方案4】:

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

          String name = Person.name;
          

          【讨论】:

            【解决方案5】:

            将getField方法改为getDeclaredField

            用try/catch包围代码,又报错(不兼容 类型:java.lang.String 和 java.lang.reflect.Field)

            因为getDeclaredField 将返回Field 类型的对象而不是String, 只需将您的代码更改为此

            Field field = myClass.getDeclaredField("name");
            //do something with field
            

            【讨论】:

              猜你喜欢
              • 2015-06-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-03
              • 2016-08-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多