有关如何处理如何找到当前类路径中存在的包名称列表的任何建议?
这需要在运行时通过在类路径上加载(并执行)的类之一(即内部,不在外部)在程序中完成.
更多细节:
我考虑的一种方法是在类加载器到目前为止加载的每个类上使用反射,并从中提取包名称.但是,我的应用程序已经有数千个课程,所以我需要一个更有效的方法.
我认为另一件事情是类似于找到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 ); } } } } }