Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取密钥时java.util.Properties是如何工作的?_Java - Fatal编程技术网

获取密钥时java.util.Properties是如何工作的?

获取密钥时java.util.Properties是如何工作的?,java,Java,实例的属性是可直接寻址的,例如prop.myKey返回与myKey关联的值。我想复制这种行为 它是如何工作的 在Java中,没有什么比Python的神奇方法更好的了 具体来说,我想创建类似属性的东西,但它支持列表值。我不想添加额外的依赖项,例如commons,所以只想用最简单的方式添加它。我已经看到并正在尝试将其添加到自定义属性类中,我可能会将属性子类化,我不介意任何一种方式。您确定属性不会提供您想要的行为吗 Properties a = new Properties(); List<St

实例的属性是可直接寻址的,例如prop.myKey返回与myKey关联的值。我想复制这种行为

它是如何工作的

在Java中,没有什么比Python的神奇方法更好的了


具体来说,我想创建类似属性的东西,但它支持列表值。我不想添加额外的依赖项,例如commons,所以只想用最简单的方式添加它。我已经看到并正在尝试将其添加到自定义属性类中,我可能会将属性子类化,我不介意任何一种方式。

您确定属性不会提供您想要的行为吗

Properties a = new Properties();
List<String> listProperty = new ArrayList<>();
listProperty.add("value");
a.put("key", listProperty);
System.out.println(a.get("key"));
[价值]


Java不允许通过键直接访问属性,就好像它们是Java.util.properties类的公共实例字段一样,groovy或python使之变得简单

您需要调用getProperty方法:

或者,您可以调用get方法:

prop.get("myKey"); //this one returns a string but the return type is Object
通过属性实例,可以检索密钥集:

prop.keySet(); // returns a set of strings used as keys
就用平常的。您可以使用自己选择的分隔符存储值列表:

names: Stan,Kyle,Cartman,Kenny,Butters
代码可以简单地拆分它们:

List<String> names = Arrays.asList(properties.getProperty("names").split(","));
代码:


您所要求的在Java中是不可能的

在Java中,类的布局在编译时是固定的

如果希望对象允许x.y访问字段,那么java源代码必须在x类中包含y声明

不能向类动态添加字段

Java的方法是拥有一个List类型的字段,并简单地进行如下调用

someList.get(1);
或者类似的。Python是一个解释器,它允许您在运行时执行此类操作。Java是静态类型的,而不是


作为记录,正如有人提到的groovy:groovy实际上是一种完全动态的语言,请参见示例。但问题是:一旦您开始利用实际使用最后一点动态的特性,那么唯一的方法就是在JVM中实际运行groovy解释器。这需要花费相当多的运行时成本—也可以编译groovy脚本—这会带来更好的性能,但另一方面允许更少的动态。

不确定我是否正确回答了您的问题,但您想公开密钥吗?是的。它将从配置文件中加载。正如文档所说,属性扩展了哈希表。如果要复制该行为,可以使用Map@QBrute不,因为不是所有的值都是列表。只有prop.getPropertyKey-没有对象映射。JAXB可以将XML映射到java对象。因此,我需要实现一种方法,将配置文件中的字符串值转换为列表。请参阅我上面链接的答案,了解我正在尝试做什么。配置文件中的字符串值将采用什么格式?逗号分隔列表?否。key.1=x key.2=y与链接答案完全相同。链接问题似乎略有不同,因为它表明属性的格式为。。。A=APPLE A=ALPHABET A=ANT B=BAT B=BALL B=BUS在任何情况下,我认为您正在寻找的解决方案都是一个自定义类,它扩展属性并重写load方法以处理特定用例。或者是一个完全自定义的properties类那么properties类是如何工作的呢?它扩展了哈希表,但可以直接调用ProInstance.myKey。@jbrown不,您不能这样做。您不能直接访问属性键或使用括号符号,我不能这样做。这些值太复杂,可能包含逗号。我需要例如myVal.1=x新行myVal.2=y都可以在myVal下访问您不能使用新行作为分隔符吗?如果不是这样的话,还有很多其他的选择,包括控制字符,它们实际上是字段分隔符。不,我需要为每个列表项使用单独的键。我的错。它是groovy而不是java。似乎它也有魔力:-@jbrown当您想要groovy的完整动态魔力时,那么让它们的解释器在JVM中运行就行了。当然这是可能的,但它会显著降低执行速度。只需说确保您没有使用groovy:-D@jbrown每个工具都有它的位置。永不言败。但我还是强化了我的答案-
names: Stan\nKyle\nCartman\nKenny\nButters
List<String> names = Arrays.asList(properties.getProperty("names").split("\n"));
names: \
    Stan\n\
    Kyle\n\
    Cartman\n\
    Kenny\n\
    Butters
someList.get(1);