为了账号安全,请及时绑定邮箱和手机立即绑定

如何在类路径中读取Java包中的所有类?

如何在类路径中读取Java包中的所有类?

达令说 2019-09-02 09:04:10
我需要读取Java包中包含的类。这些类在classpath中。我需要直接从Java程序执行此任务。你知道一个简单的方法吗?List<Class> classes = readClassesFrom("my.package")
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

您可以使用此处描述的Reflections项目


它非常完整且易于使用。


以上网站的简要说明:


Reflections会扫描您的类路径,索引元数据,允许您在运行时查询它,并可以为项目中的许多模块保存和收集该信息。


例:


Reflections reflections = new Reflections(

    new ConfigurationBuilder()

        .setUrls(ClasspathHelper.forJavaClassPath())

);

Set<Class<?>> types = reflections.getTypesAnnotatedWith(Scannable.class);


查看完整回答
反对 回复 2019-09-02
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我使用这个,它适用于文件或jar档案


public static ArrayList<String>getClassNamesFromPackage(String packageName) throws IOException{

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

    URL packageURL;

    ArrayList<String> names = new ArrayList<String>();;


    packageName = packageName.replace(".", "/");

    packageURL = classLoader.getResource(packageName);


    if(packageURL.getProtocol().equals("jar")){

        String jarFileName;

        JarFile jf ;

        Enumeration<JarEntry> jarEntries;

        String entryName;


        // build jar file name, then loop through zipped entries

        jarFileName = URLDecoder.decode(packageURL.getFile(), "UTF-8");

        jarFileName = jarFileName.substring(5,jarFileName.indexOf("!"));

        System.out.println(">"+jarFileName);

        jf = new JarFile(jarFileName);

        jarEntries = jf.entries();

        while(jarEntries.hasMoreElements()){

            entryName = jarEntries.nextElement().getName();

            if(entryName.startsWith(packageName) && entryName.length()>packageName.length()+5){

                entryName = entryName.substring(packageName.length(),entryName.lastIndexOf('.'));

                names.add(entryName);

            }

        }


    // loop through files in classpath

    }else{

    URI uri = new URI(packageURL.toString());

    File folder = new File(uri.getPath());

        // won't work with path which contains blank (%20)

        // File folder = new File(packageURL.getFile()); 

        File[] contenuti = folder.listFiles();

        String entryName;

        for(File actual: contenuti){

            entryName = actual.getName();

            entryName = entryName.substring(0, entryName.lastIndexOf('.'));

            names.add(entryName);

        }

    }

    return names;

}


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 667 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信