如何获取包中的所有类名? [复制]
Posted
技术标签:
【中文标题】如何获取包中的所有类名? [复制]【英文标题】:How to get all classes names in a package? [duplicate] 【发布时间】:2013-03-09 07:35:00 【问题描述】:所以我有一个包含扩展 JPanel 的类的包,我想将它们作为选项卡动态添加。一开始我使用了一个工厂,并在其中注册了所有类并且它可以工作,但是现在我想在不知道它们的名称的情况下加载包中的所有类。我已经尝试了几件事,包括Reflections library(我觉得这很令人困惑),但我无法让它们工作。感谢您的帮助。
这是我的一个试验:
public static void registerTab()
String pkg = TabA.class.getPackage().getName();
String relPath = pkg.replace('.', '/');
URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);
if (resource == null)
throw new RuntimeException("Unexpected problem: No resource for "
+ relPath);
File f = new File(resource.getPath());
String[] files = f.list();
for (int i = 0; i < files.length; i++)
String fileName = files[i];
String className = null;
String fileNm = null;
if (fileName.endsWith(".class"))
fileNm = fileName.substring(0, fileName.length() - 6);
className = pkg + '.' + fileNm;
if (className != null)
if (!tabClasses.containsKey(className))
tabClasses.put(fileNm, className);
【问题讨论】:
反射出了什么问题? 【参考方案1】:这是我为查找包的所有类而开发的自定义解决方案:
public class ClassFinder
private static final char PKG_SEPARATOR = '.';
private static final char DIR_SEPARATOR = '/';
private static final String CLASS_FILE_SUFFIX = ".class";
private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
public static List<Class<?>> find(String scannedPackage)
String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR);
URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);
if (scannedUrl == null)
throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
File scannedDir = new File(scannedUrl.getFile());
List<Class<?>> classes = new ArrayList<Class<?>>();
for (File file : scannedDir.listFiles())
classes.addAll(find(file, scannedPackage));
return classes;
private static List<Class<?>> find(File file, String scannedPackage)
List<Class<?>> classes = new ArrayList<Class<?>>();
String resource = scannedPackage + PKG_SEPARATOR + file.getName();
if (file.isDirectory())
for (File child : file.listFiles())
classes.addAll(find(child, resource));
else if (resource.endsWith(CLASS_FILE_SUFFIX))
int endIndex = resource.length() - CLASS_FILE_SUFFIX.length();
String className = resource.substring(0, endIndex);
try
classes.add(Class.forName(className));
catch (ClassNotFoundException ignore)
return classes;
然后,只需使用:
List<Class<?>> classes = ClassFinder.find("com.package");
【讨论】:
它返回一个空列表。我是这样用的List<Class<?>> cls=ClassFinder.find(TabA.class.getPackage().getName());
@Tareq TabA
是在 JAR 中还是直接在项目的 classes 文件夹中?此解决方案仅适用于第二种情况。
直接在类文件夹中
@Tareq 那么,这应该可以工作......我不明白为什么如果没有你的项目在我面前就不能让它工作,真的很抱歉。尝试在调试模式下查看resources
枚举包含的内容。
@Tareq 你终于成功了吗?以上是关于如何获取包中的所有类名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章