【问题标题】:Accessing a value of a string defined in a interface of constants访问常量接口中定义的字符串的值
【发布时间】:2020-07-05 22:05:41
【问题描述】:

我有一个像这样的常量接口文件 ->

public interface MyConstants {
    String CONSTANT_ONE = "foo";
    String CONSTANT_TWO = "hello";
}

我如何迭代它以获取常量的值?我看到一个使用reflect 的方法,你可以像这样访问它->

Field[] interfaceFields = MyConstants.class.getFields();
for(Field f : interfaceFields) {
   f.get(f.getName());
}

这会返回一个对象,但我希望它是字符串类型。我知道我可以进行类型转换,但正确的做法是什么?

【问题讨论】:

  • "我知道我可以进行类型转换,但正确的做法是什么?" 类型转换。
  • 是的,类型转换是唯一的方法。这就是反思的本质:它被自然概括。如果您想要强类型,请避免使用反射。请注意,定义枚举既可以提供类型安全,又可以以类型安全的方式列出所有常量。
  • 嗯,准确的说是String你也可以像String str = f.get(null).toString();一样调用toString()方法,但是在其他类型的情况下,强制转换是唯一的方法。

标签: java string reflection constants


【解决方案1】:

有几种方法可以确保安全,即允许您将 Object 值强制转换为字符串,而不会出现 ClassCastException。

  1. 使用instanceOf 检查对象引用的实际类。
  2. 在访问之前检查字段的类型。
package org.example;

import java.lang.reflect.Field;

public class SO62746826 {
    public interface MyConstants {
        String CONSTANT_ONE = "foo";
        String CONSTANT_TWO = "hello";
        int CONSTANT_THREE = 1; // now we have this field casting each of the values will throw a ClassCastException on this one
    }

    public static void main(String... args) throws IllegalAccessException {
        Field[] interfaceFields = MyConstants.class.getFields();
        for(Field f : interfaceFields) {
            Object o = f.get(null);
            if (o instanceof String) {
                String s = (String)o;
                System.out.println(s);
            }
            // or
            if (f.getType().equals(String.class)) {
                String s = (String)f.get(null);
                System.out.println(s);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2012-03-27
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多