Tôi đang tìm cách liệt kê tất cả các gói con của một gói tùy ý trong Java.Liệt kê tất cả các gói con của gói
Something như thế này:
Package basePackage = getPackage("com.mypackage");
for(Package subPackage : basepackage.getSubPackages()){
System.out.println(subPackage.getName());
}
Có cách nào để làm điều đó? Cảm ơn trước.
IDE (giả sử Netbeans) làm như thế nào?
UPDATE:
Tôi cố gắng để tìm thấy tất cả các gói mappers cho MyBatis. Trong dự án của tôi, tất cả các gói bản đồ phải đặt tên là "* .mappers". Ví dụ: "a.b.mappers" hoặc "a.b.c.mappers". Vấn đề là tôi chỉ biết gói cơ sở, và không chắc chắn có bao nhiêu người lập bản đồ gói theo nó.
UPDATE: Đây là mã của tôi cố gắng sử dụng thư viện phản ánh để làm điều đó:
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;
}
Không chắc tại sao điều này không hoạt động. Không lớp được tìm thấy ở đây ....
CẬP NHẬT
Đây là mã của tôi để làm điều đó. Loại chậm, nhưng hiệu suất không phải là mối quan tâm lớn trong trường hợp của tôi. Tôi chưa bao giờ sử dụng Spring trước đây, vì vậy nếu có cách tốt hơn để làm điều đó, hãy cho tôi biết. Cảm ơn.
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));
}
Hầu hết các mã được sao chép từ How do I read all classes from a Java package in the classpath?
bạn có thấy điều này không: http://stackoverflow.com/questions/4212088/java-programmatically-determine-all-of-the-package-names-loaded-on-the-classpa – Azodious