Jestem zaznajomiony z uzyskiwaniem zawartości pliku właściwości z podaniem nazwy pliku i oczywiście MyClass.class.getResource ("*. Properties") nie będzie działać, ale jak mogę uzyskać listę WSZYSTKICH plików właściwości znajduje się w tym samym pakiecie co moja klasa?Czy możliwe jest dynamiczne ładowanie wszystkich plików właściwości zawartych w pakiecie? tj. MyClass.class.getResource ("*. properties");
Odpowiedz
Możesz robić tego rodzaju rzeczy z Wiosna. Zobacz 4. Resources, w szczególności (lub notabily?) (Lub principalementely?) (Lub głównie?) Na 4.7.2 Wildcards in application context constructor resource paths.
Przekleństwa, ktoś ukradł mój grzmot :) Zrób ciasteczko. +1 – skaffman
Zakładając, że nie jest on zapakowany w JAR, można użyć do tego celu File#listFiles()
. Oto przykład kickoff:
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");
}
});
Jeśli to JAR-pakowane, to trzeba trochę więcej kodu, aby rozpocząć JarFile
API. Możesz znaleźć inny przykład w this answer.
Niestety, nie Plik jest dozwolony. Klasa nie jest obecnie w słoiku ... ale nie wiem, co przyniesie przyszłość dla mojej klasy i nie mam żadnej kontroli nad środowiskiem, w którym to nastąpi, więc musi być tak rozłączona, jak to możliwe – Stoney
Przepraszam ... nie mam wystarczającej liczby punktów, aby zagłosować na odpowiedź jeszcze raz ... – Stoney
To jak to zrobiłem,
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
}
}
Awesome! Działa to nawet na Androidzie. Sztuczka polega na tym, że zaczyna się od 'classResource = AnyClassInTheApp.class.getResource ("/AndroidManifest.xml ")'. Wpisy wymienione w słoiku będą zawartością APK. – TWiStErRob
To jest łatwe z wiosną, więc na znikoma szansa, że używasz go, mogę dać Ci odpowiedź Wiosna oparte. – skaffman
Ok ... więc zaczynam myśleć, że to niemożliwe. Z mojego rozumowania Java korzysta z leniwego ładowania klas i dlatego program ładujący klasy nie wie, co jest w pakiecie, dopóki nie zostanie poproszony o pobranie klasy. Najbliższą rzeczą, jaką mogę wymyślić, jest * próba * rozwiązania nazwy pakietu do katalogu, zdobycie listy rekwizytów. pliki w katalogu i próby załadowania ich za pomocą metody class.getResource(). Wiem, że to hack; czy istnieje lepszy sposób? – Stoney
Aha! To brzmi, jakby to zadziałało, każda odpowiedź wykorzystująca Spring jest całkiem do przyjęcia i byłaby bardzo doceniana – Stoney