微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:以编程方式确定加载在类路径上的所有包名称

有关如何处理如何找到当前类路径中存在的包名称列表的任何建议?

这需要在运行时通过在类路径上加载(并执行)的类之一(即内部,不在外部)在程序中完成.

更多细节:

我考虑的一种方法是在类加载器到目前为止加载的每个类上使用反射,并从中提取名称.但是,我的应用程序已经有数千个课程,所以我需要一个更有效的方法.

我认为另一件事情是类似于找到JAR文件在类路径中的东西,然后对每个JAR执行并行的目录列表.但是,我不知道这是否可以在应用程序内/如何做到这一点.

奖金积分

任何人提出可以通过顶级包过滤的方式的积分.例如.显示com.xyz下的所有软件包==> com.xyz.*,com.xyz.*.*

谢谢!

解决方法

如果你确实需要安装和扫描jar文件,那么这个内置的是这个.如果你必须去那条路线,那可能会使事情变得更容易一些.

编辑#1:您可以像这样(从示例here)得到类路径:

String strClasspath = System.getProperty("java.class.path");
System.out.println("Classpath is " + strClasspath);

从那里你可以看看本地文件系统类,jar等.

编辑#2:这是一个VFS的解决方案:

import java.util.HashSet;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileType;
import org.apache.commons.vfs.VFS;

public class PackageLister {

    private static HashSet< String > packageNames = new HashSet< String >();
    private static String localFilePath;

    /**
     * @param args
     * @throws Throwable
     */
    public static void main( final String[] args ) throws Throwable {
        FileSystemManager fileSystemManager = VFS.getManager();

        String[] pathelements = System.getProperty( "java.class.path" ).split( ";" );
        for( String element : pathelements ) {
            if ( element.endsWith( "jar" ) ) {
                FileObject fileObject = fileSystemManager.resolveFile( "jar://" + element );
                addPackages( fileObject );
            }
            else {
                FileObject fileObject = fileSystemManager.resolveFile( element );
                localFilePath = fileObject.getName().getPath();

                addPackages( fileObject );
            }
        }

        for( String name : packageNames ) {
            System.out.println( name );
        }
    }

    private static void addPackages( final FileObject fileObject ) throws Throwable {
        FileObject[] children = fileObject.getChildren();
        for( FileObject child : children ) {
            if ( !child.getName().getBaseName().equals( "meta-inf" ) ) {
                if ( child.getType() == FileType.FOLDER ) {
                    addPackages( child );
                }
                else if ( child.getName().getExtension().equals( "class" ) ) {
                    String parentPath = child.getParent().getName().getPath();
                    parentPath = StringUtils.remove( parentPath,localFilePath );
                    parentPath = StringUtils.removeStart( parentPath,"/" );
                    parentPath = parentPath.replaceAll( "/","." );

                    packageNames.add( parentPath );
                }
            }
        }
    }
}

原文地址:https://www.jb51.cc/java/124744.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐