Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java反射获取包名_Java_Reflection_Package - Fatal编程技术网

使用java反射获取包名

使用java反射获取包名,java,reflection,package,Java,Reflection,Package,我想从一个单独的Java项目中获取所有包名,我应该如何在Java中更好地使用反射来实现这一点 我已经将项目导入到我的构建路径中,并尝试使用下面的代码获取包名 Package[]pack=Package.getPackages() 编辑:我没有使用jar文件,我只是导入了项目,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。仅使用getPackages()无法知道库中的每个包名,因为它只列出类加载器已知的包名。这意味着,如果一个类尚未从特定的包中加载,那么它将不在列表中 使用z

我想从一个单独的Java项目中获取所有包名,我应该如何在Java中更好地使用反射来实现这一点

我已经将项目导入到我的构建路径中,并尝试使用下面的代码获取包名

Package[]pack=Package.getPackages()


编辑:我没有使用jar文件,我只是导入了项目,因为它将在同一目录中。我只需要我创建的包,特别是以某个目录开头的包。

仅使用
getPackages()
无法知道库中的每个包名,因为它只列出类加载器已知的包名。这意味着,如果一个类尚未从特定的包中加载,那么它将不在列表中

使用zip文件处理例程打开jar文件,并按目录名读取包。使用此技术,您将发现所有包名,甚至是那些尚未“使用”的包名。基本上,任何包含
.class
文件的路径都是“包名”

----编辑为进一步的详细信息表明JAR文件未被使用---

既然你没有使用JAR文件(为什么不呢?它们真的很好!),你就必须扫描目录。要“找到”目录,您需要切碎类路径。获取类路径的方法是:

 String classpath = System.getProperty("java.class.path", null);
然后搜索每个“起点”下的所有目录,其中包含
.class
文件。一旦你拥有了所有这些,你就拥有了所有的软件包


同样,仅通过询问类加载器不可能知道所有的包,除非您能够以某种方式保证类加载器已经加载了所有的类(它通常不加载)。

只要您不需要空包,类似这样的方法应该可以工作:

/**
 * Finds all package names
 * @return Set of package names
 */
public Set<String> findAllPackages() {
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
    classLoadersList.add(ClasspathHelper.contextClassLoader());
    classLoadersList.add(ClasspathHelper.staticClassLoader());
    Reflections reflections = new Reflections(new ConfigurationBuilder()
            .setScanners(new SubTypesScanner(false), new ResourcesScanner())
            .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
            .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("my.base.package"))));
    Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);
    Set<String> packageNameSet = new TreeSet<String>();
    for (Class classInstance : classes) {
        packageNameSet.add(classInstance.getPackage().getName());
    }
    return packageNameSet;
}
/**
*查找所有包名
*@return包名集
*/
公共集findAllPackages(){
List ClassLoaderList=新建LinkedList();
添加(ClasspathHelper.contextClassLoader());
添加(ClasspathHelper.staticClassLoader());
反射反射=新反射(新配置生成器()
.setScanners(新的子扫描程序(false),新的资源扫描程序()
.setURL(ClasspathHelper.forClassLoader(classLoaderList.toArray(新类加载器[0]))
.filterInputsBy(新的FilterBuilder().include(FilterBuilder.prefix(“my.base.package”));

StEnter更新,并考虑将类打包在JAR文件中。“我想从一个单独的java项目中获取所有的包名,java如何最好地使用反射?”最终用户从这些ShanaGigAs中得到什么?您想提供什么应用程序特性?
Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);