参考来源:

以下代码一键运行:

package test;

import java.io.File;

import java.io.IOException;

import java.net.JarURLConnection;

import java.net.URL;

import java.net.URLClassLoader;

import java.util.Enumeration;

import java.util.HashSet;

import java.util.Set;

import java.util.jar.JarEntry;

import java.util.jar.JarFile;

public class ClassUtils {

public static void main(String[] args) throws Exception {

String packageName = "org.objectweb.asm";

Set classNames = getClassName(packageName, false);

if (classNames != null) {

for (String className : classNames) {

System.out.println(className);

}

}

}

/**

* 获取某包下所有类

* @param packageName 包名

* @param isRecursion 是否遍历子包

* @return 类的完整名称

*/

public static Set getClassName(String packageName, boolean isRecursion) {

Set classNames = null;

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

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

URL url = loader.getResource(packagePath);

if (url != null) {

String protocol = url.getProtocol();

if (protocol.equals("file")) {

classNames = getClassNameFromDir(url.getPath(), packageName, isRecursion);

} else if (protocol.equals("jar")) {

JarFile jarFile = null;

try{

jarFile = ((JarURLConnection) url.openConnection()).getJarFile();

} catch(Exception e){

e.printStackTrace();

}

if(jarFile != null){

getClassNameFromJar(jarFile.entries(), packageName, isRecursion);

}

}

} else {

/*从所有的jar包中查找包名*/

classNames = getClassNameFromJars(((URLClassLoader)loader).getURLs(), packageName, isRecursion);

}

return classNames;

}

/**

* 从项目文件获取某包下所有类

* @param filePath 文件路径

* @param className 类名集合

* @param isRecursion 是否遍历子包

* @return 类的完整名称

*/

private static Set getClassNameFromDir(String filePath, String packageName, boolean isRecursion) {

Set className = new HashSet();

File file = new File(filePath);

File[] files = file.listFiles();

for (File childFile : files) {

if (childFile.isDirectory()) {

if (isRecursion) {

className.addAll(getClassNameFromDir(childFile.getPath(), packageName+"."+childFile.getName(), isRecursion));

}

} else {

String fileName = childFile.getName();

if (fileName.endsWith(".class") && !fileName.contains("$")) {

className.add(packageName+ "." + fileName.replace(".class", ""));

}

}

}

return className;

}

/**

* @param jarEntries

* @param packageName

* @param isRecursion

* @return

*/

private static Set getClassNameFromJar(Enumeration jarEntries, String packageName, boolean isRecursion){

Set classNames = new HashSet();

while (jarEntries.hasMoreElements()) {

JarEntry jarEntry = jarEntries.nextElement();

if(!jarEntry.isDirectory()){

/*

* 这里是为了方便,先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug

* (FIXME: 先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug)

*/

String entryName = jarEntry.getName().replace("/", ".");

if (entryName.endsWith(".class") && !entryName.contains("$") && entryName.startsWith(packageName)) {

entryName = entryName.replace(".class", "");

if(isRecursion){

classNames.add(entryName);

} else if(!entryName.replace(packageName+".", "").contains(".")){

classNames.add(entryName);

}

}

}

}

return classNames;

}

/**

* 从所有jar中搜索该包,并获取该包下所有类

* @param urls URL集合

* @param packageName 包路径

* @param isRecursion 是否遍历子包

* @return 类的完整名称

*/

private static Set getClassNameFromJars(URL[] urls, String packageName, boolean isRecursion) {

Set classNames = new HashSet();

for (int i = 0; i < urls.length; i++) {

String classPath = urls[i].getPath();

//不必搜索classes文件夹

if (classPath.endsWith("classes/")) {continue;}

JarFile jarFile = null;

try {

jarFile = new JarFile(classPath.substring(classPath.indexOf("/")));

} catch (IOException e) {

e.printStackTrace();

}

if (jarFile != null) {

classNames.addAll(getClassNameFromJar(jarFile.entries(), packageName, isRecursion));

}

}

return classNames;

}

}

java 获取包名类名_获取指定包名下的所有类的类名(全名)相关推荐

  1. APP的包名和签名获取工具

    APP的包名和签名获取工具 下载地址: http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/doc/AppManage.apk 获取签名工具 https: ...

  2. iOS 怎样获取wifi名(无法获取wifi名)(亲测有效)

    文章目录 1.代码实现 2.iOS12后要求在开发者网站的App ID Configuration和Xcode中打开wifi开关 3.ios13后要求用户授权开启定位权限,才能获取wifi名 1.代码 ...

  3. 微信分享相关:报错“微信:包名不对,请检查包名是否与开放平台填写一致”

    背景:应用或多或少会接入微信分享的功能.但是由于某些原因,自己配置的应用信息与开放平台的信息一致,但还是会报错:"包名不对,请检查包名是否与开放平台填写一致",接下来就用两个实验来 ...

  4. 取 java 程序运行的路径_获取Java程序运行的路径 | 获取当前jar包的路径

    经过试验,不管是否是Jar包,不管是否是Tomcat部署,以下三个方法均可实现. package test; public class MyPath { public static String ge ...

  5. Android获取本机浏览器包名,并调用指定浏览器打开网页

    昨天还在嘀咕着项目快做完了,接下来公司会安排什么事,结果今天就给了我一个新任务,其中要做的一个功能就是指定调用谷歌浏览器打开网页,如果没有该浏览器就提示客户进行下载,查找一番资料后,觉得这种东西还是要 ...

  6. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  7. java定义包的关键字_如何定义包,关键字是什么?

    展开全部 Java关键字及其作用 一. 关键字总览: 访问控制 private protected public 类62616964757a686964616fe59b9ee7ad9431333363 ...

  8. py获取前端的参数_获取百度指数

    百度指数简介 百度指数有一个详细的帮助文档,下面列出来的几个点是我的个人总结: 百度指数是度量网民搜索量多寡的指数,可以用来描述社会对某某某的关注度. 百度指数大众版不要钱,百度指数专业版要钱,但不对 ...

  9. java包限制使用时间_给jar包加壳限制使用时间

    展开全部 很多程序员在使用eclipse开发应用程序,必然会用到jar包,由于不清楚jar包的位置,又每次都32313133353236313431303231363533e58685e5aeb931 ...

最新文章

  1. iphone用计算机显示器,苹果显示器接普通电脑怎么操作【详细介绍】
  2. 2010年7月微软最有价值专家(MVP)当选名单
  3. 基于 Zookeeper 的分布式锁实现
  4. (二)boost库之字符串格式化
  5. Beaglebone Back学习三(开发环境搭建)
  6. 阿里巴巴基于Java容器的多应用部署技术实践
  7. Flutter实战之Image和FadeInImage
  8. 精心整理|Python爱好者社区历史文章合集(作者篇)--20190925从豆瓣获取
  9. 软件测试工作的不足与改善,软件测试工作中对问题的发现和改进
  10. gcc:扩展功能:除标准里定义的C特性之外的功能;-pedantic
  11. 使用OpenCV实现运动背景的重建
  12. 声网连麦+直播+视频+游戏“史上最强”社交直播方案 打造陌陌全新8.0改版
  13. BZOJ4487 [JSO12015] 染色问题 容斥原理
  14. 拼多多校招----大整数相乘(python)
  15. Clion安装及相关环境(MinGW和OpenOCD)的配置及利用Clion点亮led灯
  16. 材料研究生转行做什么?
  17. 《 FreeSWITCH权威指南》——1.2 电话实现技术
  18. (gMLP)Pay Attention to MLPs
  19. 古诺双寡头模型MATLAB求解(博弈论)
  20. 使用Harr特征的级联分类器实现目标检测

热门文章

  1. LDAP 配置 ldap_bind: Invalid credentials (49)
  2. 关于数据库内“表”的几点
  3. Hive 正则匹配函数 regexp_extract
  4. 手机端 超链接 识别电话号码
  5. 如何在word里面插入目录
  6. oracle中的NVL,NVL2,NULLIF,COALESCE函数使用
  7. Directx11教程(19) 画一个简单的地形
  8. Windows2008 组策略应用
  9. BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)
  10. CentOS tcpdump的使用实例