【问题标题】:Referencing packages in java without using String在java中引用包而不使用String
【发布时间】:2020-09-18 01:54:13
【问题描述】:

有没有办法在不使用字符串的情况下在代码中引用 java 中的包?

让我解释一下自己:

我有一个函数可以获取包中包含的所有对象,但我必须使用字符串来引用该包,比如说“com.google.guava”。但是,如果我更改了包名称,IDE 将无法自动重构引用,或者如果包是外部的并且在主要版本更改后消失,则在编译时不会检测到它。

对于类,我会尽可能直接使用 Class 对象,或者如果我需要的是表示类的 FQDN 的字符串,我会使用 Class#getName,但我不知道是否有办法使用包。

有时我只是这样做

Class<?> clazz = Foo.class;
Package p = clazz.getPackage();

这更像是一个好奇而不是真正的问题,我通常只是通过 String 引用并编写一个 junit 测试以检测这种方式使用的 nom-existant 包

【问题讨论】:

  • Foo.class.getPackage() 已经是你能得到的最好的了。但是“包含在一个包中的所有对象”是没有意义的。包包含类,而不是对象。
  • @Holger 好吧,我得到了配置文件和其他东西,我知道它们在概念上不在包中(关于 Java),但它们在同一个目录中,包就是这样我用来查找文件夹。英语不是我的母亲语言,我想让帖子尽可能简单。我的函数返回所有 java 属性文件、xml 配置和类(它用于代码生成器,该函数获取现有生成的文件以更新它们。我知道它们应该在特定的资源文件夹中,但我继承了糟糕的项目结构:()。这个问题主要是好奇
  • 我不认为资源必须在特定的资源文件夹中。但是,如果您的意思是“资源”,则不应该说“对象”。当您想要访问资源时,获取Package 对象是没有意义的,因为Package 类不提供任何资源查找功能。 Package 类仅用于允许访问元信息。无论如何都必须通过Foo.class.getResource(…) 访问资源。遍历所有资源的标准方法是to open a filesystem

标签: java reflection package


【解决方案1】:

我可以想到以下方法来获取Package 对象:

  1. 致电classLoader.getPackage(java.lang.String)Package.getPackage(java.lang.String)。这些方法已弃用。

  2. 致电Package classLoader.getDefinedPackage(java.lang.String)

  3. 致电Package class.getPackage()

  4. 调用Package[] Package.getPackages(),然后在结果数组中扫描您想要的。

最后两种方法符合使用String 查找Package 的条件。

对于包来说,没有等同于 Java“类文字”(即SomeClass.class)。

【讨论】:

  • 所有解决方案都有相同的“问题”,但是,“对于包来说,没有等效于 Java 的“类文字”(即 SomeClass.class)。”部分回答了我的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2010-12-31
  • 2015-02-12
相关资源
最近更新 更多