我正在尋找一種方法來列出Java中任意軟件包的所有子軟件包。列出軟件包的所有子軟件包
事情是這樣的:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
有沒有辦法做到這一點?提前致謝。
IDE(比方說Netbeans)如何做到這一點?
UPDATE:
我試圖找到所有映射器包MyBatis的。在我的項目中,所有的mappers軟件包都必須命名爲「* .mappers」。例如:「a.b.mappers」或「a.b.c.mappers」。事情是我只知道基礎包,不知道它下面有多少個映射器包。
UPDATE: 這裏是我的代碼試圖利用反射庫來做到這一點:
private Set<String> getPackagesNames() {
Reflections reflections = new Reflections("com.mypackage");
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
Set<String> packageNames = new HashSet<>();
for(Iterator<Class<? extends Object>> it = allClasses.iterator(); it.hasNext();) {
Class<? extends Object> subClass= it.next();
packageNames.add(subClass.getPackage().getName());
}
return packageNames;
}
不知道爲什麼,這是行不通的。無級在這裏找到....
UPDATE
這裏是我的代碼來做到這一點。有點慢,但在我的情況下,表現並不是那麼重要。我之前從未使用過Spring,所以如果有更好的方法去做,請告訴我。謝謝。
private static Set<String> getPackages(String basePackage) throws IOException, ClassNotFoundException {
Set<String> packagesNames = new HashSet<>();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + "/" + "**/*.class";
Resource[] resources = resourcePatternResolver.getResources(packageSearchPath);
for(Resource resource : resources) {
MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
Class aClass = Class.forName(metadataReader.getClassMetadata().getClassName());
String packageName = aClass.getPackage().getName();
packagesNames.add(packageName);
}
}
return packagesNames;
}
private static String resolveBasePackage(String basePackage) {
return ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage));
}
大部分代碼是從How do I read all classes from a Java package in the classpath?
你有沒有看到這個:http://stackoverflow.com/questions/4212088/java-programmatically-determine-all-of-the-package-names-loaded-on-the-classpa – Azodious 2013-04-09 04:17:23