Java 是否可以动态加载包中包含的所有属性文件?i、 e.MyClass.class.getResource(';*.properties';);

Java 是否可以动态加载包中包含的所有属性文件?i、 e.MyClass.class.getResource(';*.properties';);,java,jakarta-ee,properties,classpath,classloader,Java,Jakarta Ee,Properties,Classpath,Classloader,我熟悉以文件名获取属性文件的内容,显然MyClass.class.getResource('*.properties')不起作用,但如何获取与我的类位于同一个包中的所有属性文件的列表?假设它不是JAR打包的,您可以使用它。以下是一个启动示例: String path = MyClass.class.getResource("").getPath(); File[] propertiesFiles = new File(path).listFiles(new FilenameFilter() {

我熟悉以文件名获取属性文件的内容,显然MyClass.class.getResource('*.properties')不起作用,但如何获取与我的类位于同一个包中的所有属性文件的列表?

假设它不是JAR打包的,您可以使用它。以下是一个启动示例:

String path = MyClass.class.getResource("").getPath();
File[] propertiesFiles = new File(path).listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.endsWith(".properties");
    }
});

如果它是JAR打包的,那么首先需要多一点代码。您可以在中找到另一个示例。

您可以使用Spring来完成这类操作。请看,特别是(或明显地?)或(原则上?)或(主要地?)在。

我就是这样做的

Class<? extends Object> clazz = AnyKnownClassInTheJar.class;
String classFileName = clazz.getSimpleName() + ".class";
URL classResource = clazz.getResource(classFileName);
if (!"jar".equals(classResource.getProtocol())) {
    // Class not from JAR
    return;
}
JarURLConnection classConnection = (JarURLConnection)classResource.openConnection();
JarFile jar = classConnection.getJarFile();
for (Enumeration<JarEntry> i = jar.entries(); i.hasMoreElements();) {
    JarEntry entry = i.nextElement();
    if (entry.getName().endsWith(".properties")) {
        // Load the property file
    }
}

classspring很简单,所以如果您不太可能使用它,我可以给您一个基于Spring的答案。好的。。。所以我开始认为这是不可能的。据我所知,Java使用惰性类加载,因此类加载程序在被要求检索类之前不知道包中有什么。我能想到的最接近的方法是尝试将包名解析为目录,获取一个prop列表。并尝试通过类.getResource()加载它们。我知道这是一个黑客;有更好的办法吗?啊哈!这听起来是可行的,任何使用Spring的回答都是可以接受的,而且会非常受欢迎。请用
@昵称
发表有针对性的评论,例如@skaffman,以便他得到通知:)是的,使用
java.io.File
和配偶这样做很讨厌。是的,Spring解决方案会更好。@skaffman您能提供的任何Spring解决方案都会非常有用。谢谢您的时间提醒,不允许使用文件。类当前不在jar中。。。但是我不知道我的班级的未来会是什么样子,我也无法控制这个班级将要运行的环境,所以它需要尽可能地解耦。有人偷了我的雷霆:)吃块饼干+1我们好!这甚至适用于Android。这里的技巧是从
classResource=AnyClassInTheApp.class.getResource(“/AndroidManifest.xml”)
开始。jar中列出的条目将是APK内容。