从Java中的常量动态读取字符串数组的值

Posted

技术标签:

【中文标题】从Java中的常量动态读取字符串数组的值【英文标题】:Dynamically read value of string array from constant in Java 【发布时间】:2022-01-19 00:16:17 【问题描述】:

我想动态读取字符串数组常量的值。

常量类有汽车的字符串数组。 NeedValueOf 将动态附加常量名称,即 常量。needValueOf

告诉我获取动态值的方法,在获取对象后,我希望从该对象中获取值。 我想在我的方法中获取所有字符串数组值,以便我可以迭代和访问字符串汽车名称

Class Constants
Private final static String[] car ="Honda","Toyota", "Volkswagen";

Class Main
Public static void main()
String needValueOf ="car";
Constants.class.getDeclaredFields(needValueOf).get(null);




It is providing : [Ljava.lang.String;@47483]

【问题讨论】:

请在问题中显示您复制和粘贴的实际代码,而不是重新输入。 Class.forName("Constants").getDeclaredField("car").get(null); @AmirAfghani 不是静态字段 应该是这样。 @tgdavies 我已经格式化了代码。 【参考方案1】:

由于数组是常量,只需将数组公开并按名称访问即可。

public class Constants
    public final static String[] car ="Honda","Toyota", "Volkswagen";


public class Main
    public static void main(String[] args)
        String[] arr = Constants.car; // access it by name
    

不需要使用反射。 99.99% 的情况下,反思是你能做出的最糟糕的选择。剩下的时间只是一个糟糕的选择。

如果数组不是常量,您可以提供 getter 方法并创建数组的防御性副本。但根据您的问题,这超出了范围。

更新

如果“动态”是主要重点,因为有很多数组常量,并且您想通过传递 String 来访问它们,那么您只需将它们放在一个映射中。

public class Constants
    private final static String[] cars ="Honda","Toyota", "Volkswagen";
    private final static String[] boats = ...;
    public static Map<String, String[]> myConstants = new HashMap<>();

    public Constants () 
        myConstants.put("cars", cars);
        myConstants.put("boats", boats);
    


public class Main
    public static void main(String[] args)
        String[] carsArr = myConstants.get("cars");
        String[] boatsArr = myConstants.get("boats");
    

地图不应该是public static。它甚至不应该是可修改的。所有的访问都应该通过方法来控制。这样,您可以控制在类之外传递的内容(即地图的副本)。

【讨论】:

【参考方案2】:

[Ljava.lang.String;@47483 只是 toString 上的 String[]

您正在正确检索值。

要使用它,请执行以下操作:

public class App 

    private static final String[] car = "Honda", "Toyota", "Volkswagen";

    public static void main(String... args) throws NoSuchFieldException, IllegalAccessException 

        String needValueOf = "car";
        String[] xs = (String[]) App.class.getDeclaredField(needValueOf).get(null);
        System.out.println(xs);
        for (String x : xs) 
            System.out.println(x);
        
    

哪个打印:

[Ljava.lang.String;@41629346
Honda
Toyota
Volkswagen

【讨论】:

谢谢你..它工作了

以上是关于从Java中的常量动态读取字符串数组的值的主要内容,如果未能解决你的问题,请参考以下文章

到底使用字符数组还是字符串常量

如何从数组中动态设置下拉列表的值

从文本文件中读取单词并存储到 C 中的动态数组 Valgrind 错误中

如何从java中的mysql表中检索数组中的值? [关闭]

深入Java源码剖析之字符串常量

动态读取文本文件并放入 C 中的指针字符数组