我有一个有一些价值的字符串.我想迭代调用特定方法的包中的所有类,如果方法返回的值等于我的String中的值,则创建该类的对象.
我想以动态方式执行此操作,因此如果我在此包中添加一个类,它将自动进行迭代.
这可能吗?如果没有,有办法做我想要的吗?
我期待着类似的东西.
for(Class clazz: SomeClass.listClasses("org.package")){
//code here
}
Run Code Online (Sandbox Code Playgroud)
不,这是不可能以完全可靠的方式; 但是,在许多情况下实施可能是实际的.
由于Java类加载器的灵活性,在特定包下定义的类可能在运行时不可知(例如,考虑一个特殊的类加载器,它可以动态定义类,可能是通过从网络加载它们,或者编译它们的广告 - 特别).因此,没有标准的Java API允许您列出包中的类.
但实际上,您可以通过在类路径中搜索所有类和JAR文件,构建完全限定类名的集合以及根据需要搜索它们来做一些技巧.如果您确定没有活动的类加载器将按照上一段中的描述运行,则此策略可以正常工作.例如(Java伪代码):
Map<String, Set<String>> classesInPackage = new HashMap();
for (String entry : eachClasspathEntry()) {
if (isClassFile(entry)) {
String packageName = getPackageName(entry);
if (!classesInPackage.containsKey(packageName)) {
classesInPackage.put(packageName, new HashSet<String>());
}
classesInPackage.get(packageName).add(getClassName(entry));
} else if (isJarOrZipFile(entry)) {
// Do the same for each JAR/ZIP file entry...
}
}
classesInPackage.get("com.foo.bar"); // => Set<String> of each class...
Run Code Online (Sandbox Code Playgroud)