当前位置: 首页 > 面试题库 >

在静态初始化程序块中加载Java属性

谷森
2023-03-14
问题内容

我有一个静态util类,它对敏感数据进行一些字符串操作。在使用此类之前,我需要使用我喜欢存储在.properties文件中的值(例如用户名/密码)初始化某些静态变量。

我不太熟悉.propertiesJava 中文件的加载方式,尤其是在 Spring DI 容器之外。任何人都可以帮助我/如何做到这一点?

谢谢!

另外:
.properties文件的精确位置是未知的,但是它将在类路径上。有点像classpath:/my/folder/name/myproperties.propeties


问题答案:

首先,从中获取InputStream要加载的属性。这可以来自多个位置,包括一些最可能的位置:

  • A FileInputStream,使用硬编码或通过系统属性指定的文件名创建。名称可以是相对的(相对于Java进程的当前工作目录)或绝对的。
  • 资源文件(类路径上的文件),通过getResourceAsStreamClass(相对于类文件)或ClassLoader(相对于类路径的根)的调用获得。请注意,如果资源丢失,这些方法将返回null,而不是引发异常。
  • URL,其中,像一个文件名,可以通过设置系统属性硬编码或指定。

然后创建一个新Properties对象,并将其传递InputStream给其load()方法。无论有任何例外,请确保关闭流。

在类初始化程序中,IOException必须处理类似检查的异常。可以引发未经检查的异常,这将阻止类的初始化。这样通常会完全阻止您的应用程序运行。在许多应用程序中,可能希望改用默认属性,或者回退到其他配置源,例如提示在交互式上下文中使用。

总共看起来可能像这样:

private static final String NAME = "my.properties";

private static final Properties config;

static {
  Properties fallback = new Properties();
  fallback.put("key", "default");
  config = new Properties(fallback);

  URL res = MyClass.getResource(NAME);
  if (res == null) throw new UncheckedIOException(new FileNotFoundException(NAME));
  URI uri;
  try { uri = res.toURI(); }
  catch (URISyntaxException ex) { throw new IllegalArgumentException(ex); }

  try (InputStream is = Files.newInputStream(Paths.get(uri))) { config.load(is); } 
  catch (IOException ex) { throw new UncheckedIOException("Failed to load resource", ex); }
}


 类似资料:
  • 问题内容: 据我了解,“静态初始化块”用于设置静态字段的值(如果无法在一行中完成的话)。 但是我不明白为什么我们需要为此设置一个特殊的块。例如,我们将字段声明为静态(无值分配)。然后编写几行代码,生成并为上面声明的静态字段分配一个值。 为什么我们需要在这样一个特殊的块这样的行:? 问题答案: 在非静态块: 每次构造类的实例时被调用。在静态块只被调用一次,当类本身初始化,无论该类型的有多少对象创建。

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。

  • 问题内容: 我正在尝试发现初始化发生的顺序,或者更确切地说,为什么要按此顺序进行初始化的原因。给定代码: 输出: 但是,将的声明移动到初始化块之前会产生: 而且我完全不知道为什么会以这种顺序发生。此外,如果我在的声明中消除了关键字,则init块和构造函数均不会触发。谁能帮我这个忙吗? 问题答案: 我认为您只是缺少JLS的12.4.2节,其中包括: 接下来,以文本顺序执行类的类变量初始化器和静态初始

  • 问题内容: 考虑以下 代码 : 我们知道,首先将执行 静态 块,然后执行 空 块。但是问题是,我从未能够理解 空 块的真正用途。任何人都可以展示一个真实的例子,其中- 无论 静态 和 空 正在使用的块 无论 静态 和 空 块具有不同的事业 问题答案: 它们用于两个非常不同的目的: 静态初始化程序块将在加载类时被调用,并且将无法访问实例变量或方法。根据@Prahalad Deshpande的评论,它

  • 问题内容: Kotlin 中的静态初始化块等效于什么? 我了解Kotlin的设计宗旨是不带静电。我正在寻找具有等效语义的东西-首次加载该类时,代码将运行一次。 我的特定用例是,我想从Android AppCompat库启用DayNight功能,并且说明要求将一些代码放入类的静态初始化块中。 问题答案: 从某种角度看,Kotlin中的s等同于Java类的静态部分。特别是,它们是在首次使用类之前初始化